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

标签 c++ css image qt opencv

我想每 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

在 header 中我声明: cv::Mat edges1, src_gray1, edges2, src_gray2, src_gray3;

my question: whats the problem in subtraction method, is the size of the gray-scale Mat is the problem?, how I can set Same properties for the two images to get Over that.

我用的是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';
}

最佳答案

问题是 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';
   }

关于c++ - 使用 Opencv 和 Qt 对两个灰度图像进行减法的使用条款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893624/

相关文章:

c++ - 如何在 Tensorflow 的 C++ API 中解码后获取图像形状

c++ - 访问多维数组是否比访问线性数组慢?

c++ - Sleep()函数Windows 8 C++

c++ - 为什么我的对象在不使用 `new` 的情况下似乎在堆上?

c++ - 如何在 C++ 的 STL 容器值中拥有 const 成员?

html - 如何管理 Angular 响应式设计?

wcf - 在 WCF 中,我如何返回包含 System.Drawing.Image 属性的类?

html - Css Nth-Child 选择器未选择预期的元素

javascript - 溶解标题的背景图像

html - 为什么我的图像尺寸过大?