调用电脑摄像头并将其显示在MFC控件中

         本文是基于OPencv调用摄像头的,调用摄像头好像只能通过opencv来实现(至少其他的方法我不会委屈)。关于opencv的配置大家去网上百度或者看我的这篇博客《OPencv在VS2013中的配置》。


一、打开摄像头

设置一些全局变量:

typedef struct ColorImageMes
{
	RGBQUAD** BYImageData;    //彩色图像像素数据
	double**  DOImageData;
	_In_ int    Height;    //图像高
	_In_ int    Width;     //图像宽
} ColorimageMes;

                   //定义变量
#define IMAGE_WIDTH   320       //设置显示打开视频窗口的大小 ,320x240是允许的最小格式
#define IMAGE_HEIGHT  240    
VideoCapture Capture;          //设置摄像头类名
Mat frame;                     //一帧
ColorImageMes   CPicture;     //用于存储每一帧的像素值    
                       //初始化   
        CPicture.Height = IMAGE_HEIGHT;    //初始化
        CPicture.Width = IMAGE_WIDTH;
        CPicture.BYImageData = new RGBQUAD*[CPicture.Height]; 
	for (int j = 0; j < CPicture.Height; j++) {
		CPicture.BYImageData[j] = new RGBQUAD[CPicture.Width];
        }

打开摄像头:

/***********************************************************************************
**打开电脑相机并将其画在控件中
PStaic:方法:(CStatic*)GetDlgItem(ID)
*:status:finfish
**********************************************************************************/
void OpenCameraToShow(CStatic *pStaic)
{
	Capture.open(0);                  // 0:捕获前摄像头    1:捕获后摄像头
	Capture.set(CV_CAP_PROP_FRAME_WIDTH, IMAGE_WIDTH);  //设置视频大小
	Capture.set(CV_CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT); 
	namedWindow("view", WINDOW_NORMAL | CV_WINDOW_FREERATIO); //创建视频窗口
	HWND hWnd = (HWND)cvGetWindowHandle("view");
	HWND hParent = ::GetParent(hWnd);
	///将摄像头图象直接画在控件中
	::SetParent(hWnd, pStaic->m_hWnd);     
	::ShowWindow(hParent, SW_HIDE);//隐藏运行程序框,并且把它“画”到MFC的控件中;
	while(Capture.isOpened()){                             //循环以达到视频的效果
		Capture >> frame;
	    if (!frame.empty()){
	    	imshow("view", frame);
	    	//添加用户图象处理函数
	     	GetImagePixelFromCamera();       //该函数是用于读取每一帧的像素值


		 }
		 waitKey(1);                     //这句必须加,否则你会发现视频不会动一直停留在第一帧
	}
}
读取每一帧的像素值:
/***********************************************************************************
**获取摄像头每帧的像素值
*:status:finfish
**********************************************************************************/
void GetImagePixelFromCamera()
{
	uint8_t* pixelPtr = (uint8_t*)frame.data;     //像素数据指针
	int cn = frame.channels();                    //RGB通道
	for (int i = 0; i < frame.rows; i++){
		for (int j = 0; j < frme.cols; j++){
			CPicture.BYImageData[i][j].rgbBlue  = pixelPtr[i*frame.cols*cn + j*cn + 0]; // B
			CPicture.BYImageData[i][j].rgbGreen = pixelPtr[i*frame.cols*cn + j*cn + 1]; // G
			CPicture.BYImageData[i][j].rgbRed   = pixelPtr[i*frame.cols*cn + j*cn + 2]; // R
			CPicture.BYImageData[i][j].rgbReserved = 0;
		}
	}	
}
二、关闭摄像头

该函数中的两句缺一不可

void OutCamera()
{
	Capture.release();     //关闭摄像头
	destroyWindow("view"); //销毁指定的窗口
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值