⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 capproc.cpp

📁 1394 接口视觉工具箱 (英文工具箱
💻 CPP
📖 第 1 页 / 共 4 页
字号:
unsigned int		row, col, k;
unsigned int		u, v;
unsigned int		BytesPerRow = (unsigned int)(frameWidth*3);

	k = 0;
	for(row=0; row<dims[0] /* height */; row++) {
		for(col = 0; col<processFrameWidth; col+=6, k++) {

			/* average adjacent 'u-components' */
			u         = src[(origY+row)*BytesPerRow + firstPacketStart+col    ];
			dst[k].u  = (unsigned char)((u + src[(origY+row)*BytesPerRow + firstPacketStart+col + 3]) >> 1); // u
			dst[k].y1 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 1];	// y1
			/* average adjacent 'v-components' */
			v         = src[(origY+row)*BytesPerRow + firstPacketStart+col + 2];
			dst[k].v  = (unsigned char)((u + src[(origY+row)*BytesPerRow + firstPacketStart+col + 5]) >> 1); // u
			dst[k].y2 = src[(origY+row)*BytesPerRow + firstPacketStart+col + 4];	// y2

		}
	}

	//mexPrintf("yuyv buffer contains %d elements\n", k);

}
//----------------------------------------------------------



//----------------------------------------------------------
// CMU driver: The YUV4,2,2 format is UYUV for two adjacent pixels
// -> 'convert' YUV422 (u y1 v y2) image to YUYV (u y1 v y2) equivalent (copy)
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(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 = theCamera.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(const char *feature, int vLo, int vHi = 0) {

int					fID = dc1394GetFeatureId(feature);
int					aa;
		
	if((pControl = theCamera.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(void) {

#define maxBufLen 100
		
char	myBuf[maxBufLen];
int		myBufLen = maxBufLen;
int		myNode, numCameras;


	#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 = theCamera.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 ============================================ */


	theCamera.RefreshCameraList();

	numCameras = theCamera.GetNumberCameras();
	mexPrintf("\n%-30s %d\n", "Number of cameras found:", numCameras);
	
	myNode = theCamera.GetNode();
	theCamera.GetNodeDescription(myNode, myBuf, myBufLen);
	mexPrintf("Device description (node %d):   %s\n", myNode, myBuf);
	
	theCamera.GetCameraName(myBuf, myBufLen);
	mexPrintf("%-30s %s\n", "Camera name:", myBuf);
	
	theCamera.GetCameraVendor(myBuf, myBufLen);
	mexPrintf("%-30s %s\n", "Vendor name:", myBuf);
	
	mexPrintf("%-30s %ld\n", "Version number:", theCamera.GetVersion());
	
	mexPrintf("%-30s %d\n", "Max speed:", theCamera.GetMaxSpeed());
	
	mexPrintf("%-30s %d\n", "Link status", theCamera.CheckLink());
	
	mexPrintf("%-30s %d\n", "Has power control:", theCamera.HasPowerControl());
	mexPrintf("%-30s %d\n", "Status power control:", theCamera.StatusPowerControl());
	//int	 SetPowerControl(BOOL	on);
	
	mexPrintf("%-30s %d\n", "Has 1394b:", theCamera.Has1394b());
	mexPrintf("%-30s %d\n", "Status 1394b:", theCamera.Status1394b());
	//int	 Set1394b(BOOL on);
	
	// read out camera eeprom
	mexPrintf("%-30s %d\n", "Number of channels (camera):", theCamera.MemGetNumChannels());
	mexPrintf("%-30s %d\n", "Current channel (camera):", theCamera.MemGetCurrentChannel());
	
	// read out registry
	//mexPrintf("%-30s %d\n", "Default brightness (registry):", theCamera.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(theCamera.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 = theCamera.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(void) {

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("Shutter", -1, 0);
		mySetFeature("Saturation", -1, 0);
		mySetFeature("White Balance", -1, -1);
		mySetFeature("Gain", -1, 0);
		mySetFeature("Auto Exposure", -1, 0);
		mySetFeature("Brightness", -1, 0);

	} else {

		/* 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(strcmpi(myStr, "[Camera_1]") == 0) {

				/* found definition for 'camera_1' -> read 7 values... */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -