Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在我的代码中,哪里违反了Mat等价规则?_Image Processing_Opencv_Background Subtraction - Fatal编程技术网

Image processing 在我的代码中,哪里违反了Mat等价规则?

Image processing 在我的代码中,哪里违反了Mat等价规则?,image-processing,opencv,background-subtraction,Image Processing,Opencv,Background Subtraction,我试图在openCV 2.2中使用cv名称空间(Qt4.7)实现背景减法。我有下面的代码,它编译得很好,但是在运行程序时会中断,因为一个mat不等于另一个mat,但我无法找到它在哪里,我目前正在通过API引用尝试找到它 cvtColor( mcolImage, mcolImage, CV_BGR2RGB); cvtColor( mcolImage, gscaleImage, CV_RGB2GRAY); acc = Mat(Siz

我试图在openCV 2.2中使用cv名称空间(Qt4.7)实现背景减法。我有下面的代码,它编译得很好,但是在运行程序时会中断,因为一个mat不等于另一个mat,但我无法找到它在哪里,我目前正在通过API引用尝试找到它

           cvtColor( mcolImage, mcolImage, CV_BGR2RGB);
           cvtColor( mcolImage, gscaleImage, CV_RGB2GRAY);

           acc = Mat(Size(440,320), CV_32FC3);
           accSQ = Mat(Size(440,320), CV_32FC3);

           //we accumulate into a Mat to get an frames average
           Mat avg;
           accumulateWeighted(gscaleImage, acc, 3.0, Mat());
           accumulateSquare(gscaleImage, accSQ, Mat());
           multiply(acc, acc, avg, 1);

           Mat sigma, sigmaSQRT;
           subtract(accSQ, avg, sigmaSQRT, Mat());
           sqrt(sigmaSQRT, sigma); //Holds the standard deviation

           Mat fgImage; //hold the foreground image
           cv::absdiff(avg,gscaleImage, fgImage);

           //GaussianBlur(gscaleImage, gscaleImage, Size(7,7), 2, 2 );

           Mat buff ;
           //convert to black and white
           threshold(fgImage, buff, 75, THRESH_BINARY, 100);

           dilate(buff, buff, Mat(3, 3, CV_8UC1), Point(-1, -1), 1, BORDER_CONSTANT, Scalar(1.0, 1.0, 1.0, 0));
           erode(buff, buff, Mat(3, 3, CV_8UC1), Point(-1, -1), 1, BORDER_CONSTANT, Scalar(1.0, 1.0, 1.0, 0));

           //rectangle(gscaleImage, cvPoint(100, 300), cvPoint(200, 100), cvScalar(255, 255, 255, 0), 1);

           QImage colImagetmp((uchar*)mcolImage.data, mcolImage.cols, mcolImage.rows, mcolImage.step,
                              QImage::Format_RGB888 ); //Colour

           QImage gscaleImagetmp ((uchar*)gscaleImage.data, gscaleImage.cols, gscaleImage.rows, gscaleImage.step,
                              QImage::Format_Indexed8); //Greyscale. I hope

           QImage bwImagetmp((uchar*)buff.data, buff.cols, buff.rows, buff.step,
                            QImage::Format_Indexed8);

           //Setup a colour table for the greyscale image
           QVector<QRgb> colorTable;
           for (int i = 0; i < 256; i++) colorTable.push_back(qRgb(i, i, i));
           bwImagetmp.setColorTable(colorTable);
           gscaleImagetmp.setColorTable(colorTable);


           ui.intDisplay->setPixmap(QPixmap::fromImage(bwImagetmp));
           ui.bwDisplay->setPixmap(QPixmap::fromImage(gscaleImagetmp));
           ui.colDisplay->setPixmap( QPixmap::fromImage(colImagetmp ));
cvtColor(mcolImage、mcolImage、CV_BGR2RGB);
CVT颜色(mcolImage、GSCALIMAGE、CV_RGB2GRAY);
acc=垫(尺寸(440320),CV_32FC3);
accSQ=垫(尺寸(440320),CV_32FC3);
//我们累积到一个垫子里,得到一个平均帧数
Mat平均值;
累计加权(gscaleImage,acc,3.0,Mat());
累计方(gscaleImage、accSQ、Mat());
乘(acc,acc,平均值,1);
Mat-sigma,sigmaSQRT;
减去(accSQ、avg、sigmaSQRT、Mat());
sqrt(sigmaSQRT,sigma)//保持标准偏差
Mat图像//保持前景图像
cv::absdiff(平均值、gscaleImage、fgImage);
//GaussianBlur(gscaleImage,gscaleImage,大小(7,7),2,2);
垫抛光;
//转换成黑白
阈值(fgImage,buff,75,THRESH_BINARY,100);
扩张(buff,buff,Mat(3,3,CV_8UC1),点(-1,-1),1,边界_常数,标量(1.0,1.0,1.0,0));
腐蚀(抛光,抛光,垫(3,3,CV_8UC1),点(-1,-1),1,边界_常数,标量(1.0,1.0,1.0,0));
//矩形(gscaleImage,cvPoint(100300),cvPoint(200100),cvScalar(255,255,255,0),1);
QImage colImagetmp((uchar*)mcolImage.data,mcolImage.cols,mcolImage.rows,mcolImage.step,
QImage::格式(RGB888)//颜色
QImage gscaleImagetmp((uchar*)gscaleImage.data,gscaleImage.cols,gscaleImage.rows,gscaleImage.step,
QImage::格式(索引8)//灰阶。我希望
QImage bwmagetmp((uchar*)buff.data,buff.cols,buff.rows,buff.step,
QImage::格式(索引8);
//为灰度图像设置颜色表
矢量彩色表;
对于(inti=0;i<256;i++)颜色表,向后推(qRgb(i,i,i));
bwImagetmp.setColorTable(可着色);
gscaleImagetmp.setColorTable(可着色);
ui.intDisplay->setPixmap(QPixmap::frommage(bwImagetmp));
ui.bwDisplay->setPixmap(QPixmap::frommage(gscaleImagetmp));
ui.colDisplay->setPixmap(QPixmap::frommage(colImagetmp));
感谢您在advanced中的帮助

编辑:

在检查代码之后,我发现
absdiff(avg、gscaleImage、fgImage)是程序崩溃的地方。我想它可能会在第二个参数上崩溃,但不确定。

我通过声明一个新的临时Mat并将其具体转换(使用avg.convert())以匹配gscaleImage类型和大小来解决它(我想)