2011-09-30 124 views
2

使用opencv显示图像时,我总是会看到一个灰色屏幕,图像是从相机捕获的。Opencv:从摄像头捕获的图像始终为灰色

capture = cvCaptureFromCAM(-1); 
cvGrabFrame(capture); 
image = cvRetrieveFrame(capture); 
cvShowImage("name", image); 

之后,我看到灰色的屏幕,即使我在循环中。但是相同的代码在另一台计算机上运行良好。问题是什么?两台计算机都使用相同的opencv库版本。在Visual Studio 2010中工作,C++ Opencv版本2.2.0

编辑1:在两台计算机中使用的相机是相同的。 而我试图重新在问题发生的计算机上的opencv,它没有帮助。

+0

你应该尝试设备索引= 0,只是一个想法.. – Adrian

+0

试过了,没有帮助。其实相机正在工作,我看到它上面的蓝色指示灯亮起。问题在于我认为opencv中的某个地方。 – maximus

+0

这里解释:http://opencv.willowgarage.com/documentation/reading_and_writing_images_and_video.html,当使用RetrieveFrame时,你首先调用GrabFrame。另一种方法是使用单个调用QueryFrame。 – crisbia

回答

1

你的问题听起来很奇怪,我希望这将有助于

尝试使用cvQueryFrame代替cvRetrieveFrame() ,让我知道,如果它确实让diffrence。

这里是使用OpenCV进行人脸检测的代码,捕捉图像的概念是非常simular:

int main(int argc, const char** argv) 
{ 
CvCapture* capture; 
Mat frame; 
//-- 1. Load the cascades 
if(!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 
if(!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 

//-- 2. Read the video stream 
capture = cvCaptureFromCAM(-1); 
if(capture) 
{ 
while(true) 
{ 
    frame = cvQueryFrame(capture); 

    //-- 3. Apply the classifier to the frame 
    if(!frame.empty()) 
    { detectAndDisplay(frame); } 
    else 
    { printf(" --(!) No captured frame -- Break!"); break; } 

    int c = waitKey(10); 
    if((char)c == 'c') { break; } 

} 
}return 0; 
} 
+0

对不起,但cvQueryFrame没有帮助。 – maximus

4

我OpenCvSharp有同样的问题。我不知道是什么原因,但出于某种原因,在显示图像后调用“WaitKey”方法解决了它。

CvCapture mov = new CvCapture(filepath); 
IplImage frame = mov.QueryFrame(); 
CvWindow win1 = new CvWindow(window name); 
win1.ShowImage(frame); 
CvWindow.WaitKey(1); 
+0

系统需要时间将图像绘制到窗口上,而不需要WaitKey添加额外的延迟,因此您正在绘制新的速度,实际显示无法跟上。 – RyanfaeScotland