2017-03-19 64 views
0

我想每隔40ms从灰度中减去两个图像,我从两个摄像机每隔40ms捕捉两个图像,然后将两个图像大小设置为(height = 480,width = 640),之后我转换为灰度。 但是当我使用两个图像的减法(absdiff)时,我得到“运行时错误”。 我注意到,当我显示两个图像的大小时,我得到了两个灰度图像大小不匹配的结果。使用Opencv和Qt的两个灰度图像的使用条件减去图像使用Opencv和Qt

src_gray1 cols is: =640 src_gray1 rows is: =480 src_gray1.size =0x28fd5c 
src_gray2 cols is: =640 src_gray2 rows is: =480 src_gray2.size =0x28fdcc 
在我宣布页眉

: CV ::垫edges1,src_gray1,edges2,src_gray2,src_gray3;

我的问题:什么在扣除方法的问题,是 大小灰度垫的问题?我如何为 两个图像设置相同的属性来克服这一点。

我使用Qt 5.5.0,我的代码在这里:

void MainWindow::on_pushButton_pressed() 
{ 
    timer_40_ms->start(); 
    timer2_40_ms->start(); 
    cap1.open(0); 
    if(!cap1.isOpened()) 
    { 
     std::cout<<"Camera1 did not open"; 
     return; 
    } 
    cap2.open(1); 
    if(!cap2.isOpened()) 
    { 
     std::cout<<"Camera2 did not open"; 
     return; 
    } 
    cap1.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap1.set(CV_CAP_PROP_FRAME_WIDTH,640); 
    cap2.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap2.set(CV_CAP_PROP_FRAME_WIDTH,640); 

} 
void MainWindow::ProcessFrame() 
{ 
    cv::Mat frame1; 
    ii++; 
    ui->textEdit->setText(QString::number(ii)); 
    cap1 >> frame1; 
    cvtColor(frame1, src_gray1, CV_BGR2GRAY); 
    std::cout<<"src_gray1 cols is:"<<" ="<<src_gray1.cols<<" "<<"src_gray1 rows is:"<<" ="<<src_gray1.rows<<" "<<"src_gray1.size ="<<src_gray1.size<<'\n'; 
    } 
void MainWindow::ProcessFrame2() 
{ 
    cv::Mat frame2; 
    ii2++; 
    cap2 >> frame2; 
    cvtColor(frame2, src_gray2, CV_BGR2GRAY); 
    ui->textEdit_3->setText(QString::number(ii2)); 
    absdiff(src_gray1,src_gray2,src_gray3); 
    cv::imshow("CAM2 Video Labeler", src_gray3); 
    std::cout<<"src_gray2 cols is:"<<" ="<<src_gray2.cols<<" "<<"src_gray2 rows is:"<<" ="<<src_gray2.rows<<" "<<"src_gray2.size ="<<src_gray2.size<<'\n'; 
} 
+0

什么样的运行时错误?你尝试过调试吗?你发现了什么? |顺便说一句,您正在使用'Mat :: size'(最有可能打印包含指针的值)。您应该调用'()'运算符,并且如果您需要像素数,请在结果上调用'.area()'。即'src_gray1.size()。area()'。 –

+0

@抛出'cv :: Exception'实例后调用的DanMašek终止 该操作既不是'array op array'(其中数组具有相同的大小和相同数量的通道),也不是'array op scalar',也不是'标量操作数组'arithm_op – user119436

+0

@DanMašek运行时错误是“此应用程序已经请求运行时以非常规方式终止它”。当我使用减法操作时,问题就会出现。 – user119436

回答

0

的问题是,ProcessFrame2()被ProcessFrame()之前被调用,谢谢@丹马塞克求助:

 void MainWindow::on_pushButton_pressed() 
    { 
    timer_40_ms->start(); 
    timer2_40_ms->start(); 
    cap1.open(0); 
    if(!cap1.isOpened()) 
    { 
     std::cout<<"Camera1 did not open"; 
     return; 
    } 
    cap2.open(1); 
    if(!cap2.isOpened()) 
    { 
     std::cout<<"Camera2 did not open"; 
     return; 
    } 
    cap1.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap1.set(CV_CAP_PROP_FRAME_WIDTH,640); 
    cap2.set(CV_CAP_PROP_FRAME_HEIGHT,480); 
    cap2.set(CV_CAP_PROP_FRAME_WIDTH,640); 

    } 
void MainWindow::ProcessFrame() 
{ 
    cv::Mat frame1; 
    ii++; 
    ui->textEdit->setText(QString::number(ii)); 
    cap1 >> frame1; 
    cvtColor(frame1, src_gray1, CV_BGR2GRAY); 
    absdiff(src_gray1,src_gray2,src_gray3); 
    cv::imshow("CAM2 Video Labeler", src_gray3); 
    std::cout<<"src_gray1 cols is:"<<" ="<<src_gray1.cols<<" "<<"src_gray1 rows is:"<<" ="<<src_gray1.rows<<" "<<"src_gray1.size ="<<src_gray1.size<<'\n'; 
    } 
void MainWindow::ProcessFrame2() 
{ 
    cv::Mat frame2; 
    ii2++; 
    cap2 >> frame2; 
    cvtColor(frame2, src_gray2, CV_BGR2GRAY); 
    ui->textEdit_3->setText(QString::number(ii2)); 

    std::cout<<"src_gray2 cols is:"<<" ="<<src_gray2.cols<<" "<<"src_gray2 rows is:"<<" ="<<src_gray2.rows<<" "<<"src_gray2.size ="<<src_gray2.size<<'\n'; 
    }