代码:
int main(int argc, const char** argv)
{
CvCapture* capture = 0;
Mat frame, image;
capture = cvCaptureFromCAM(-1);
//capture = cvCaptureFromFile("1.avi");
cvNamedWindow("result", 1);
Sleep(2000);
if (capture)
{
cout << "In capture ..." << endl;
for (;;)
{
IplImage* iplImg = cvQueryFrame(capture);
frame = cv::cvarrToMat(iplImg);
if (frame.empty())
{
cout << "No Frame ..." << endl;
break;
}
imshow("result", frame);
cvWaitKey(33);
}
}
else
{
cerr << "ERROR: Could not initiate capture" << endl;
return -1;
}
cvReleaseCapture(&capture);
cvDestroyWindow("result");
return 0;
}
问题描述:
capture可以打开,但是无法抓取frame。
原因:
查找资料看到,可能是因为驱动的原因导致。windows 下的摄像头的都用了Directshow,而opencv 的这两个函数都需要使用VFW的驱动才能正常使用。
解决方法:
使用videocapture
int main(int argc, char** argv)
{
VideoCapture cap;
if (argc > 1)
cap.open(argv[1]);
else
cap.open(0);
if (!cap.isOpened())
{
std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl;
return -1;
}
Mat frame;
for (;;)
{
cap >> frame;
if (frame.empty())
break;
imshow("FG Segmentation", frame);
int c = waitKey(30);
if (c == 'q' || c == 'Q' || (c & 255) == 27)
break;
}
return 0;
}