本文是基于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"); //销毁指定的窗口
}