2013-08-01 141 views
0

我想从网络摄像头捕获图像,无需任何后处理,即自动对焦,曝光校正,白平衡和东西。基本上,我想从网络摄像头捕捉连续的帧,并使每个帧与前一帧进行比较,并仅在存在实际更改时将其保存到磁盘。由于后处理几乎每一帧都被返回,因此对我来说不同。opencv从网络摄像头捕获图像,无需后处理

代码到目前为止

using namespace cv; 



bool identical(cv::Mat m1, cv::Mat m2) 
{ 


if (m1.cols != m2.cols || m1.rows != m2.rows || m1.channels() != m2.channels() || m1.type() != m2.type()) 
{ 
    return false; 
} 

for (int i = 0; i < m1.rows; i++) 
{ 
    for (int j = 0; j < m1.cols; j++) 
    { 
     if ( m1.at<Vec3b>(i, j) != m2.at<Vec3b>(i, j)) 
     { 
      return false; 
     } 
    } 
} 
return true; 
} 


int main() { 
CvCapture* capture = cvCaptureFromCAM(1); 
int i=0,firsttime=0; 
char filename[40]; 
Mat img1,img2; 
if (!capture) { 
fprintf(stderr, "ERROR: capture is NULL \n"); 
getchar(); 
return -1; 
} 

cvNamedWindow("img1", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow("img2", CV_WINDOW_AUTOSIZE); 

    while (1) { 

IplImage* frame = cvQueryFrame(capture); 
img1=frame; 
if (!frame) { 

    fprintf(stderr, "ERROR: frame is null...\n"); 
    getchar(); 
    break; 
} 
if(firsttime==0){ 
img2=frame; 
fprintf(stderr, "firtstime\n"); 
} 

if ((cvWaitKey(10) & 255) == 27) break; 

i++; 

sprintf(filename, "D:\\testimg\\img%d.jpg", i); 


cv::cvtColor(img1, img1, CV_BGR2GRAY); 
imshow("img1", img1); 
imshow("img2", img2); 
imwrite(filename,img1); 

if(identical(img1,img2)) 
{ 
    //write to diff path 
} 


img2=imread(filename,1); 
firsttime=1; 
} 
// Release the capture device housekeeping 
cvReleaseCapture(&capture); 
return 0; 
} 

尽管乌尔它,我将是伟大的充分,如果ü可以提出一个解决方法该使用其他框架藏汉比较的解决方案:)

回答

0

有点运气,你可以得到你的相机的属性页,并从那里切换东西:

VideoCapture cap(0); 
cap.set(CV_CAP_PROP_SETTINGS,1); 

和请,跳过c-api赞成C++。它会很快消失。

忘了提及:你也改变了vlc的凸轮设置。

+0

哦酷TY :)。 。这是我的问题的答案:) –

+0

但仍然比较仍然搞砸了。 。我猜想像素逐像素比较不会解决:P。 。 。有什么建议么? –

1

我有这个问题,并发现和写的唯一的解决方案是基于直接显示的程序(如果你使用Windows),所以没有opencv代码

+0

下面的那个人回答了这个问题。 。但我也对我们的解决方案感兴趣。 。 。即时通讯有点新有此,所以任何代码片段或样品你将不胜感激:) –

+0

最后,我最终使用直接显示与aforge。 。所以迟到ty我猜:) –

0

@Pince,对不起,我一直在寻找我的Directshow代码,我没有找到它,我不认为它会帮助,因为我用它的DirectLink(黑魔法设计)卡,因为我已经从来没有这样做,这很难,我的建议将尝试使用GraphEditPlus: http://www.infognition.com/GraphEditPlus/

它帮助了很多,它很容易使用! 祝你好运!

0

如果您只是希望在出现实际更改时捕获帧,请尝试背景减法算法。此外,不是仅仅减去后续帧,而是使用OpenCV中已为您实施的许多算法之一 - 它们比闪烁条件等变化更强大,而不是香草背景扣除。

在Python:

backsub = cv2.BackgroundSubtractorMOG2(history=10000,varThreshold=100) 
fgmask = backsub.apply(frame, None, 0.01) 

Frame是从摄像头读取图片流。 Google for the cpp中的相应函数为 。