平台:wen7+vc6.0+opencv1.0
读取摄像头本来是很容易实现的,但是还得针对应用什么样的平台,在网上搜的很多代码,在wen7+vc6.0+opencv1.0的平台上就不工作,摄像头画面不是黑的就是会的,但是在xp系统下就可以很好地运行出来,在wen7+vs2010+opencv2.4.4上也能很好的运行出来。看来系统和工具的版本同步很重要。
经过多天努力终于在wen7+vc6.0+opencv1.0的平台上实现了摄像头的读取,当然也能对其数据进行处理。代码如下:
#include <stdio.h>
#include <iostream.h>
#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
HWND MyWin;
// 设置系统属性
cvcamSetProperty(1, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像头
//camera
cvcamSetProperty(1, CVCAM_PROP_RENDER, CVCAMTRUE); //We'll render stream
// 假设创建一个窗口,并且窗口的ID是在变量 MyWin 中定义
// MyWin 是窗口 HWND 的类型
MyWin = (HWND) cvGetWindowHandle("cvcam window");
cvcamSetProperty(1, CVCAM_PROP_WINDOW, &MyWin); // Selects a window for video rendering
//回调函数将处理每一帧
cvcamSetProperty(1, CVCAM_PROP_CALLBACK, callback);
cvcamInit( );
cvcamStart( );
// 现在程序开始工作
cvWaitKey();//等待窗口出现
cvcamStop();
cvcamExit();
return 0;
}
注:如果想对读取的的帧图像处理,则只需编辑cvcamSetProperty(1, CVCAM_PROP_CALLBACK, callback)中的callback函数,想怎么处理就怎么处理了!
例如:在帧图像中显示蓝线:
void callback(IplImage* image)
{
IplImage* image1 = image;
int i,j;
assert (image);
for(i=0; i<image1->height; i+=10)
{
for(j=(image1->widthStep)*i;j<(image1->widthStep)*(i+1);
j+=image1->nChannels)
{
image1->imageData[j] = (char)255;
image1->imageData[j+1] = 0;
image1->imageData[j+2] = 0;
}
}
}
此方法在学习opencv入门的里中有,估计是最原始的办法吧(个人意见)!
另附:
一般的读取摄像头的代码如下:
#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv) {
cvNamedWindow("win");
CvCapture* capture = cvCreateCameraCapture(0);
IplImage* frame = cvQueryFrame(capture);
while(1) {
frame = cvQueryFrame(capture);
if(!frame) break;
IplImage* out = cvCreateImage(cvGetSize(frame), frame->depth, 1);
cvCanny(frame, out, 10, 100, 3);
cvShowImage("win", out);
cvReleaseImage(&out);
char c = cvWaitKey(50);
if(c==27) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("win");
return 0;
}