C++ 使用Opencv&;Qt

C++ 使用Opencv&;Qt,c++,css,image,qt,opencv,C++,Css,Image,Qt,Opencv,我想每40ms减去两幅灰度图像,我从两台摄像机上每40ms拍摄两幅图像,然后将两幅图像的大小设置为(高度=480,宽度=640),然后转换为灰度。 但是当我对两幅图像使用减法(absdiff)时,我得到了“运行时错误”。 我注意到,当我显示两幅图像的大小时,我得到了两幅灰度图像大小不匹配的结果 src_gray1 cols is: =640 src_gray1 rows is: =480 src_gray1.size =0x28fd5c src_gray2 cols is: =640 src

我想每40ms减去两幅灰度图像,我从两台摄像机上每40ms拍摄两幅图像,然后将两幅图像的大小设置为(高度=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
在标题中,我声明: cv::材料边缘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';
}
void主窗口::按下按钮()
{
计时器\u 40_ms->start();
定时器2_40_ms->start();
cap1.开放(0);
如果(!cap1.isOpened())
{
std::cout frame1;
CVT颜色(框架1,src_灰色1,CV_BGR2灰色);

std::cout问题在于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';
   }
void主窗口::按下按钮()
{
计时器\u 40_ms->start();
定时器2_40_ms->start();
cap1.开放(0);
如果(!cap1.isOpened())
{
std::cout frame1;
CVT颜色(框架1,src_灰色1,CV_BGR2灰色);
absdiff(src_gray1、src_gray2、src_gray3);
cv::imshow(“CAM2视频贴标机”,src_gray3);

std::coutWhat排序的运行时错误?您尝试调试了吗?您发现了什么?顺便说一句,您使用的
Mat::size
不正确(很可能是打印了包含指针的值)。您应该调用
()
操作符,如果您想要像素数,请调用
.area()
,查看结果。即
src\u gray1.size().area()
@DanMašek terminate在抛出“cv::Exception”实例后调用该操作既不是“array op array”(其中数组具有相同大小和相同数量的通道),也不是函数arithm中的“array op scalar”,也不是“scalar op array”_op@DanMašek运行时错误为“此应用程序已请求运行时以异常方式终止它"。当我使用减法运算时,问题就出现了。如果您发布了真实代码并打印了输出,则这两种方法中的任何一种都不会出现运行时错误,因为这两种方法都接近方法的末尾。@DanMašek是的,您是对的,我在注释减法函数时看到了Cout的输出但当我取消对指令的注释时,会出现运行时错误