使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款

Posted

技术标签:

【中文标题】使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款【英文标题】:Terms of use subtraction for two grayscale Images using Opencv & Qt 【发布时间】:2017-03-19 23:27:01 【问题描述】:

我想每 40 毫秒减去两个灰度图像,我每 40 毫秒从两个摄像头捕获两个图像,然后将两个图像大小设置为(高度 = 480,宽度 = 640),之后我转换为灰度. 但是当我对两个图像使用减法(absdiff)时,我得到“运行时错误”。 我注意到,当我显示两个图像的大小时,我得到两个灰度图像大小的无与伦比的结果。

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

在我声明的标题中: 简历::垫边1,src_gray1,边2,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';

【问题讨论】:

什么样的运行时错误?你试过调试吗?你找到了什么? |顺便说一句,您使用 Mat::size 不正确(很可能打印包含指针的值)。您应该调用() 运算符,如果您需要像素数,请在结果上调用.area()。即src_gray1.size().area(). @DanMašek 在抛出 'cv::Exception' 的实例后调用终止该操作既不是 'array op array' (其中数组具有相同的大小和相同的通道数),也不是 'array op scalar',也不是函数 arithm_op 中的 'scalar op array' @DanMašek 运行时错误是“此应用程序已请求运行时以不寻常的方式终止它”。问题出现在我使用减法运算时。 如果您发布了您的真实代码并打印了该输出,则在这两种方法中似乎都不会发生运行时错误,因为两个 cout 都接近方法的结尾。 @DanMašek 是的,你是对的,我在注释减法函数指令时看到 Cout 的输出,但是当我取消注释指令时出现运行时错误 【参考方案1】:

问题是 ProcessFrame2() 在 ProcessFrame() 之前被调用,谢谢@dan Masek 的帮助:

     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';
   

【讨论】:

以上是关于使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款的主要内容,如果未能解决你的问题,请参考以下文章

如何将opencv灰度和彩色图像发送到Qt中的ftp服务器?

QT+QT creator+OpenCV图像灰度化

OpenCV图像处理一图像相加相减相乘与相除的实现

python使用openCV图像加载(转化为灰度图像)使用filter2D函数对图像进行锐化(Sharpen Images)

python使用openCV把原始彩色图像转化为灰度图使用矩阵索引的方式对数据数据进行剪裁(image cropping)

qt+opencv图像处理实现笔记