capprocstereo2.cpp
来自「1394 接口视觉工具箱 (英文工具箱」· C++ 代码 · 共 1,884 行 · 第 1/4 页
CPP
1,884 行
void convYUV422_2_YUYV(image_pixel *dst, unsigned char *src) {
unsigned int row, col, k;
unsigned int BytesPerRow = (unsigned int)(frameWidth*2);
k = 0;
for(row=0; row<dims[0] /* height */; row++) {
for(col = 0; col<processFrameWidth; col+=4, k++) {
dst[k].u = src[(origY+row)*BytesPerRow + firstPacketStart+col ]; // u
dst[k].y1 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 1]; // y1
dst[k].v = src[(origY+row)*BytesPerRow + firstPacketStart+col + 2]; // v
dst[k].y2 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 3]; // y2
}
}
//mexPrintf("yuyv buffer contains %d elements\n", k);
}
//----------------------------------------------------------
//----------------------------------------------------------
// CMU driver: The YUV4,1,1 format is UYYVYY for four adjacent pixels
// -> convert YUV411 (u y1 y2 v y3 y4) image to YUYV (u y1 v y2, u y3 v y4) equivalent
// note: 6 input values represent 4 pixels -> bytes per row: frameWidth/4*6 = frameWidth*3/2
void convYUV411_2_YUYV(image_pixel *dst, unsigned char *src) {
unsigned int row, col, k;
unsigned int BytesPerRow = (unsigned int)(frameWidth*3/2);
// convert YUV411 (UYYVYY) to YUYV (CMVISION)
// NOTE: 'formattedOrigX' selects the correct YUV411 element (includes the first requested pixel)
// 'dims[1]' is an integer multiple of the number of pixels in each camera element (4)
// EXAMPLE: '3 pixels from pixel #4 on' -> need two packets (y1-y4) & (y5-y10)
// => firstPacketStart = 0, lastPacketStart = 6, dims[0] = 12
// | | |
// _________________v ____v__v_________
// --0--1--2--3--4--5---6--7--8--9-10-11--12-13--14-15--16--17
// -u1-y1-y2-v1-y3-y4--u2-y5-y6-v2-y7-y8--u3-y9-y10-v3-y11-y12
//
// firstPacketStart = (((int)(4/4)-1) >= 0 ? ((int)(4/4)-1) : 0 ) * 6 =
// (((int)(1)-1) >= 0 ? ((int)(1)-1) : 0 ) * 6 =
// (0 >= 0 ? 0 : 0 ) * 6 = 0 * 6 ========================== 0
// lastPacketStart = ((int)(4+3/4) >= 0 ? (int)(4+3/4) : 0 ) * 6 =
// ((int)(7/4) >= 0 ? (int)(7/4) : 0 ) * 6 =
// ((int)(1.75) >= 0 ? (int)(1.75) : 0 ) * 6 =
// (1 >= 0 ? 1 : 0 ) * 6 = 1 * 6 ========================== 6
// processFrameWidth = (lastPacketStart - firstPacketStart + 1) * 6 =
// (1 - 0 + 1) * 6 ======================================== 12
//
k = 0;
for(row=0; row<dims[0] /* height */; row++) {
for(col = 0; col<processFrameWidth; col+=6, k+=2) {
dst[k].u = src[(origY+row)*BytesPerRow + firstPacketStart+col ]; // u
dst[k].y1 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 1]; // y1
dst[k].y2 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 2]; // y2
dst[k].v = src[(origY+row)*BytesPerRow + firstPacketStart+col + 3]; // v
dst[k+1].u = dst[k].u;
dst[k+1].y1 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 4]; // y3
dst[k+1].y2 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 5]; // y4
dst[k+1].v = dst[k].v;
}
}
//mexPrintf("yuyv buffer contains %d elements\n", k);
}
//----------------------------------------------------------
//----------------------------------------------------------
// dispatcher for all conv<TYPE>_2_YUYV methods (above)
void convCurrentFrame2YUYV(unsigned int cam, myCameraModes mode, image_pixel *yuyvDest) {
unsigned char *cameraBuf; /* pointer raw data (camera) */
unsigned long cameraBufLength; /* number of bytes stored in the camera buffer (not used) */
/* get pointer to raw data (irrespective of the chosen format) */
cameraBuf = Camera[cam].GetRawData(&cameraBufLength);
switch(mode) {
case CAMERA_YUV444_160x120:
// convert YUV422 (UYUV) to YUYV (a mere copy - probably done inefficiently)
convYUV444_2_YUYV(yuyvDest, cameraBuf);
break;
case CAMERA_YUV422_320x240:
case CAMERA_YUV422_640x480:
// convert YUV422 (UYUV) to YUYV (a mere copy - probably done inefficiently)
convYUV422_2_YUYV(yuyvDest, cameraBuf);
break;
case CAMERA_YUV411_640x480:
// convert YUV411 (UYYVYY) to YUYV
convYUV411_2_YUYV(yuyvDest, cameraBuf);
break;
case CAMERA_RGB8_640x480:
// convert RGB8 (RGB) to YUYV
convCameraRGB_2_YUYV(yuyvDest, cameraBuf);
break;
case CAMERA_Y8_640x480:
// convert B&W (Y8) to YUYV
convY8_2_YUYV(yuyvDest, cameraBuf);
break;
case CAMERA_Y16_640x480:
// convert B&W (Y8) to YUYV
// not tested (fire-i does not support Y16, fw-01-08)
convY16_2_YUYV(yuyvDest, cameraBuf);
break;
default:
// do nothing (e.g. mode == -1)
;
} /* switch */
}
//----------------------------------------------------------
/* mySetFeature =========================================================== */
/* helper function to set a named feature (e.g. 'Brightness') to a specific value */
static void mySetFeature(unsigned int cam, const char *feature, int vLo, int vHi = 0) {
int fID = dc1394GetFeatureId(feature);
int aa;
if((pControl = Camera[cam].GetCameraControl(CAMERA_FEATURE(fID))) != NULL) {
/* found the named feature -> check if manual setting has been requested */
if(vLo < 0 || vHi < 0) {
/* request for automatic mode (if available) */
if(pControl->HasAutoMode()) {
/* (re-)activate automatic mode */
pControl->SetAutoMode(TRUE);
}
} else {
/* manual mode -> set low and high value */
pControl->SetValue(vLo, vHi);
/* is this an automatically controlled feature */
aa = pControl->HasAutoMode();
if(aa) {
/* force automatic mode to off... */
pControl->SetAutoMode(FALSE);
}
}
} else {
/* feature name not registered */
mexPrintf("Unknown cameara feature '%s'\n", feature);
}
} /* mySetFeature ========================================================== */
/* dumpCameraStats ========================================================= */
/* dump some info about the selected camera to the workspace window */
static void dumpCameraStats(unsigned int cam) {
#define maxBufLen 100
char myBuf[maxBufLen];
int myBufLen = maxBufLen;
int myNode;
#ifdef DEBUGONLY /* ============================================= */
/* display list of all features as registered by the driver... */
for(int i=0; i<FEATURE_NUM_FEATURES; i++) {
/* current feature */
CAMERA_FEATURE fID = (CAMERA_FEATURE)(i);
if((pControl = Camera[cam].GetCameraControl(fID)) != NULL) {
/* call 1394camapi function 'dc1394GetFeatureName' to determine feature name */
mexPrintf("Camera feature %d is registered as '%s'\n", fID, dc1394GetFeatureName(fID));
} else {
/* feature name not registered */
mexPrintf("Camera feature %d has no registered name\n", fID);
}
}
#endif /* DEBUGONLY ============================================ */
/* display the properties of chosen camera... */
Camera[cam].RefreshCameraList();
myNode = Camera[cam].GetNode();
Camera[cam].GetNodeDescription(myNode, myBuf, myBufLen);
mexPrintf("Device description (node %d): %s\n", myNode, myBuf);
Camera[cam].GetCameraName(myBuf, myBufLen);
mexPrintf("%-30s %s\n", "Camera name:", myBuf);
Camera[cam].GetCameraVendor(myBuf, myBufLen);
mexPrintf("%-30s %s\n", "Vendor name:", myBuf);
mexPrintf("%-30s %ld\n", "Version number:", Camera[cam].GetVersion());
mexPrintf("%-30s %d\n", "Max speed:", Camera[cam].GetMaxSpeed());
mexPrintf("%-30s %d\n", "Link status", Camera[cam].CheckLink());
mexPrintf("%-30s %d\n", "Has power control:", Camera[cam].HasPowerControl());
mexPrintf("%-30s %d\n", "Status power control:", Camera[cam].StatusPowerControl());
//int SetPowerControl(BOOL on);
mexPrintf("%-30s %d\n", "Has 1394b:", Camera[cam].Has1394b());
mexPrintf("%-30s %d\n", "Status 1394b:", Camera[cam].Status1394b());
//int Set1394b(BOOL on);
// read out camera eeprom
mexPrintf("%-30s %d\n", "Number of channels (camera):", Camera[cam].MemGetNumChannels());
mexPrintf("%-30s %d\n", "Current channel (camera):", Camera[cam].MemGetCurrentChannel());
// read out registry
//mexPrintf("%-30s %d\n", "Default brightness (registry):", Camera[cam].RegLoadSettings("HKEY_LOCAL_MACHINE/SOFTWARE/CMU/1394Camera/6143140808066302/ControlPanes/DefaultView/Brightness"));
// check all video modes supported by the CMU driver for availability on the currently connected camera
//
// NOTE: 'format' always set to '0' (= max resolution: 640 x 480 .... unibrain fire-i)
//
// fw-01-08
//
for(int ii=0; ii<numMYCAMERAMODES; ii++) {
VIDEO_MODE_DESCRIPTOR myModeDesc;
/* get video mode description, format: 0L, */
dc1394GetModeDescriptor(0L, (ULONG)ii, &myModeDesc);
dc1394GetModeString(0L, (ULONG)ii, myBuf, myBufLen);
if(Camera[cam].HasVideoMode(0L, ii)) {
mexPrintf("%-30s %s [%d bits per pixel]\n", "Camera supports video mode:", myBuf, (int)dc1394GetBitsPerPixel(myModeDesc.colorcode));
} else {
mexPrintf("%-30s %s\n", "Unsupported video mode:", myBuf);
}
}
// display selected features
{
int fID;
unsigned short aa, bb;
/* display current settings of the above features... */
for(int i=0; i<numMYFEATURES; i++) {
fID = dc1394GetFeatureId(myFeatures[i].name);
mexPrintf("\nFeature '%s' (ID %d)\n", myFeatures[i].name, fID);
/* get chosen feature control object */
pControl = Camera[cam].GetCameraControl(CAMERA_FEATURE(fID));
pControl->GetRange(&aa, &bb);
mexPrintf("%-30s %d, %d\n", "Range (min, max):", aa, bb);
pControl->GetValue(&aa, &bb);
if(bb) {
/* feature with a range */
mexPrintf("%-30s %d, %d\n", "Current values (low, high):", aa, bb);
} else {
/* feature with a single value */
mexPrintf("%-30s %d\n", "Current value:", aa, bb);
}
/* selected attributes */
aa = pControl->HasManualMode();
if(aa == 0) {
mexPrintf("%-30s %d\n", "Attribute 'ManualMode' (!):", aa);
}
aa = pControl->HasAutoMode();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'AutoMode':", pControl->StatusAutoMode());
}
aa = pControl->HasOnePush();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'OnePush':", pControl->StatusOnePush());
}
aa = pControl->HasOnOff();
if(aa) {
mexPrintf("%-30s %d\n", "Attribute 'OnOff':", pControl->StatusOnOff());
}
// always '1'...
//
//aa = pControl->HasPresence();
//if(aa) {
// mexPrintf("%-30s %d\n", "Attribute 'Presence':", pControl->StatusPresence());
//}
/* absolute control... (scaled) */
if(pControl->HasAbsControl()) {
float faa, fbb;
pControl->GetRangeAbsolute(&faa, &fbb);
mexPrintf("%-30s %g, %g\n", "Scaled range (min, max):", faa, fbb);
pControl->GetValueAbsolute(&faa);
mexPrintf("%-30s %g\n", "Scaled value:", faa);
}
} /* for all features */
}
} /* dumpCameraStats ======================================================= */
/* myConfigCamera =========================================================== */
static void myConfigCamera(unsigned int cam) {
FILE *fp;
/* setup camera(s) */
mexPrintf("\nAdjusting camera settings...\n");
if((fp = fopen("cameraconfig.txt","r")) == NULL) {
mexPrintf("Couldn't find camera configuration file ('cameraconfig.txt') -> using default values, automatic wherever possible.\n");
/* use default camera settings - values found using the control dialog of '1394CameraDemo.exe' */
//mySetFeature("Shutter", 6, 0);
//mySetFeature("Saturation", 90, 0);
//mySetFeature("White Balance", 69, 96);
//mySetFeature("Gain", 87, 0);
//mySetFeature("Auto Exposure", 511, 0);
//mySetFeature("Brightness", 304, 0);
/* negative values -> automatic mode (if possible), otherwise: keep value as is */
mySetFeature(cam, "Shutter", -1, 0);
mySetFeature(cam, "Saturation", -1, 0);
mySetFeature(cam, "White Balance", -1, -1);
mySetFeature(cam, "Gain", -1, 0);
mySetFeature(cam, "Auto Exposure", -1, 0);
mySetFeature(cam, "Brightness", -1, 0);
} else {
mexPrintf("Scanning 'cameraconfig.txt' for camera settings for camera %d\n", cam+1);
/* cameraconfig.txt found -> analyse its contents */
while(!feof(fp)) {
char myStr[30];
int myPara[7];
fscanf(fp, "%s", myStr);
//mexPrintf("Read: >>%s<<\n", myStr);
/* filter out 'Camera_1 (only using 'camera_1' here...) */
if((cam == 0) && (strcmpi(myStr, "[Camera_1]") == 0)) {
/* found definition for 'camera_1' -> read 7 values... */
mexPrintf("Programming camera '1' with: ");
for(int i=0; i<7; i++) {
fscanf(fp, "%d", &myPara[i]);
mexPrintf("%d ", myPara[i]);
}
mexPrintf("\n");
/* reset string */
myStr[0] = 0;
/* use user set of camera settings (file: cameraconfig.txt) */
mySetFeature(cam, "Shutter", myPara[0], 0);
mySetFeature(cam, "Saturation", myPara[1], 0);
mySetFeature(cam, "White Balance", myPara[2], myPara[3]);
mySetFeature(cam, "Gain", myPara[4], 0);
mySetFeature(cam, "Auto Exposure", myPara[5], 0);
mySetFeature(cam, "Brightness", myPara[6], 0);
} /* if(camera_1) */
/* filter out 'Camera_2 (only using 'camera_2' here...) */
if((cam == 1) && (strcmpi(myStr, "[Camera_2]") == 0)) {
/* found definition for 'camera_2' -> read 7 values... */
mexPrintf("Programming camera '2' with: ");
for(int i=0; i<7; i++) {
fscanf(fp, "%d", &myPara[i]);
mexPrintf("%d ", myPara[i]);
}
mexPrintf("\n");
/* reset string */
myStr[0] = 0;
/* use user set of camera settings (file: cameraconfig.txt) */
mySetFeature(cam, "Shutter", myPara[0], 0);
mySetFeature(cam, "Saturation", myPara[1], 0);
mySetFeature(cam, "White Balance", myPara[2], myPara[3]);
mySetFeature(cam, "Gain", myPara[4], 0);
mySetFeature(cam, "Auto Exposure", myPara[5], 0);
mySetFeature(cam, "Brightness", myPara[6], 0);
} /* if(camera_2) */
}
fclose(fp);
}
/* end of 'adjust settings' */
mexPrintf("done.\n");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?