Где в моем коде я нарушил правило эквивалентности Mat? - PullRequest
0 голосов
/ 21 марта 2011

Я пытаюсь добиться вычитания фона в openCV 2.2, используя пространство имен cv (Qt4.7). У меня есть следующий код, который прекрасно компилируется, но при запуске программы происходит сбой, потому что один мат не совпадает с другим, но я не могу выяснить, где он находится, и в настоящее время я пытаюсь найти ссылку на 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 ));

Спасибо за помощь в продвинутом.

Edit:

После просмотра кода я обнаружил, что absdiff(avg, gscaleImage, fgImage); - это место, где происходит сбой программы. Я думаю, что это может произойти сбой на втором параметре, но не уверен.

1 Ответ

0 голосов
/ 22 марта 2011

Я решил это (я думаю), объявив новый временный Mat и преобразовав его специально (используя avg.convert ()) для соответствия типу и размеру gscaleImage.

...