Visual c++ opencv从网络摄像头捕获图像,无需后期处理
我想从网络摄像头中捕获图像,无需任何后期处理,即无自动对焦、曝光校正、白平衡等。基本上,我想从网络摄像头中捕获连续的帧,并将每一帧与前一帧进行比较,只有在有实际变化时才将其保存到磁盘。由于后期处理,对我来说,几乎每一帧的返回都是不同的 迄今为止的代码Visual c++ opencv从网络摄像头捕获图像,无需后期处理,visual-c++,opencv,image-comparison,Visual C++,Opencv,Image Comparison,我想从网络摄像头中捕获图像,无需任何后期处理,即无自动对焦、曝光校正、白平衡等。基本上,我想从网络摄像头中捕获连续的帧,并将每一帧与前一帧进行比较,只有在有实际变化时才将其保存到磁盘。由于后期处理,对我来说,几乎每一帧的返回都是不同的 迄今为止的代码 using namespace cv; bool identical(cv::Mat m1, cv::Mat m2) { if ( m1.cols != m2.cols || m1.rows != m2.rows || m1.channe
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;
}
使用名称空间cv;
布尔相同(cv::材料m1,cv::材料m2)
{
如果(m1.cols!=m2.cols | | m1.rows!=m2.rows | | m1.channels()!=m2.channels()| | m1.type()!=m2.type())
{
返回false;
}
对于(int i=0;i
当你这么做的时候,如果你能用另一个帧比较解决方案来建议一个解决方案,我会非常满意:)我有这个问题,唯一找到并编写的解决方案是一个基于Direct show的程序(如果你使用的是windows),所以根本没有opencv代码,您可以获取相机的“属性”页面,并在那里关闭:
VideoCapture cap(0);
cap.set(CV_CAP_PROP_SETTINGS,1);
<> >请跳过C-API,而不是C++。它很快就会消失
忘了提及:您也可以从vlc更改cam设置。@Prince,很抱歉我一直在寻找我的Directshow代码,但我没有找到它,我认为它不会有帮助,因为我将它用于DirectLink(黑魔法设计)卡,因为我以前从未这样做过,因为这非常困难,我的建议是尝试使用GraphiditPlus: 它帮助很大,而且很容易使用!
祝你好运 如果您只想在发生实际变化时捕获帧,请尝试背景减法算法。此外,不要仅仅减去后续帧,而是使用OpenCV中已经为您实现的许多算法中的一种——它们比普通的背景减法对闪电条件等的变化更具鲁棒性 在Python中:
backsub = cv2.BackgroundSubtractorMOG2(history=10000,varThreshold=100)
fgmask = backsub.apply(frame, None, 0.01)
Frame
是从网络摄像头读取的图片流。
谷歌搜索Cpp中相应的函数。但是比较仍然很混乱。我想逐像素比较是行不通的:P。有什么建议吗?你下面的人回答了这个问题。但是我也对你的解决方案感兴趣。我对这一点有点陌生,所以您拥有的任何代码片段或示例都将受到极大的赞赏:)好的,最后我使用了Forge的direct show。所以我猜是一个迟到的人:)