我使用的是Mac OS X 10.6计算机。我使用Xcode及其GCC编译器从源代码编译的OpenCV 2.1 x64。
我无法使用OpenCV的C ++视频阅读功能。这是我正在使用的简单测试代码(直接来自OpenCV文档):
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
namedWindow("edges",1);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(200) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
程序编译得很好,但是当我尝试运行它时,我看到网络摄像头上的绿灯亮了几秒钟,然后程序退出并显示错误消息:
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp, line 2476
terminate called after throwing an instance of 'cv::Exception'
what(): /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in function cvGetMat
在调试模式下,在>>之后,矩阵似乎仍然是空的框架线。
当我尝试从视频文件或图像中捕获时,我得到类似的行为,因此它不是相机。有什么不对,你觉得呢?我能做些什么来使这项工作?
编辑:我想补充一点,如果我使用C功能,一切正常。但是如果可以的话,我想坚持使用C ++。
由于
答案 0 :(得分:3)
我见过同样的问题。当我使用C功能时,有时也会出现类似的问题。从C代码的错误消息,我认为这是因为相机得到一个NULL帧。所以我认为可以通过这种方式解决:
do
{
capture>>frame;
}while(frame.empty());
这样就可以在我的机器上运行。
答案 1 :(得分:2)
我遇到了同样的问题,似乎前两次尝试获取视频不会返回任何信号,所以如果你尝试使用它你会得到一个错误,这就是我如何解决这个问题,只需添加一个计数器并检查视频的大小。
int cameraNumber = 0;
if ( argc > 1 )
cameraNumber = atoi(argv[1]);
cv::VideoCapture camera;
camera.open(cameraNumber);
if ( !camera.isOpened() ) {
cerr << "ERROR: Could not access the camera or video!" << endl;
exit(1);
}
//give the camera 40 frames attempt to get the camera object,
//if it fails after X (40) attemts the app will terminatet,
//till then it will display 'Accessing camera' note;
int CAMERA_CHECK_ITERATIONS = 40;
while (true) {
Mat cameraFrame;
camera >> cameraFrame;
if ( cameraFrame.total() > 0 ) {
Mat displayFrame( cameraFrame.size(), CV_8UC3 );
doSomething( cameraFrame, displayFrame );
imshow("Image", displayFrame );
} else {
cout << "::: Accessing camera :::" << endl;
if ( CAMERA_CHECK_ITERATIONS > 0 ) CAMERA_CHECK_ITERATIONS--;
if ( CAMERA_CHECK_ITERATIONS < 0 ) break;
}
int key = waitKey(200);
if (key == 27) break;
}
答案 2 :(得分:1)
尝试简化程序,以便确定问题的确切位置,例如:改变你的循环,使它看起来像这样:
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
// cvtColor(frame, edges, CV_BGR2GRAY);
// GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
// imshow("edges", edges);
imshow("edges", frame);
if(waitKey(200) >= 0) break;
}
如果可行,则尝试一次添加一个处理调用,例如
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
// GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
imshow("edges", edges);
if(waitKey(200) >= 0) break;
}
依旧......
一旦确定了有问题的行,您就可以专注于该行并进一步调查。
答案 3 :(得分:1)
转到project->project properties->configuration properties->linker->input
在其他依赖关系中粘贴cv210.lib cvaux210.lib cxcore210.lib highgui210.lib
答案 4 :(得分:1)
您好我为您找到了解决方案:)
VideoCapture san_cap(0);
if (san_cap.isOpened()) {
while (1) {
san_cap.read(san);
imshow("Video", san);
Mat frame;
san_cap.read(frame); // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
imshow("Video2", edges);
int key = cv::waitKey(waitKeyValue);
if (key == 27 ) {
break;
}
}
}