accumweight throws cv:异常错误

时间:2014-06-04 05:21:34

标签: image-processing opencv

我是OpenCV的新手并尝试在它们上面找到轮廓并绘制矩形,这是我的代码,但是当涉及 cumulativeweighted()时,它会抛出cv :: Exception。

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <ctype.h>

using namespace cv;
using namespace std;

static void help()
{
cout << "\nThis is a Example to implement CAMSHIFT to detect multiple motion objects.\n";
}

Rect rect;
VideoCapture capture;
Mat currentFrame, currentFrame_grey, differenceImg, oldFrame_grey,background;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

bool first = true;

int main(int argc, char* argv[])
{
//Create a new movie capture object.
capture.open(0);

if(!capture.isOpened())
{
    //error in opening the video input
    cerr << "Unable to open video file: " /*<< videoFilename*/ << endl;
    exit(EXIT_FAILURE);
}   

//capture current frame from webcam
capture >> currentFrame;

//Size of the image.
CvSize imgSize;
imgSize.width = currentFrame.size().width; //img.size().width
imgSize.height = currentFrame.size().height; ////img.size().height

//Images to use in the program.
currentFrame_grey.create( imgSize, IPL_DEPTH_8U);//image.create().  

while(1)
{
    capture >> currentFrame;//VideoCapture& VideoCapture::operator>>(Mat& image)                

    //Convert the image to grayscale.
    cvtColor(currentFrame,currentFrame_grey,CV_RGB2GRAY);//cvtColor()

    // Converting Original image to make both background n original image same
    currentFrame.convertTo(currentFrame,CV_32FC3);
    background = Mat::zeros(currentFrame.size(), CV_32FC3);

    //Here its throwing exception
    accumulateWeighted(currentFrame,background,1.0,NULL);

    imshow("Background",background);

    if(first) //Capturing Background for the first time
    {
        differenceImg = currentFrame_grey.clone();//img1 = img.clone()
        oldFrame_grey = currentFrame_grey.clone();//img2 = img.clone()
        convertScaleAbs(currentFrame_grey, oldFrame_grey, 1.0, 0.0);//convertscaleabs()
        first = false;
        continue;
    }

    //Minus the current frame from the moving average.
    absdiff(oldFrame_grey,currentFrame_grey,differenceImg);//absDiff()

    //bluring the differnece image
    blur(differenceImg, differenceImg, imgSize);//blur()

    //apply threshold to discard small unwanted movements
    threshold(differenceImg, differenceImg, 25, 255, CV_THRESH_BINARY);//threshold()

    //find contours
    findContours(differenceImg,contours,hierarchy,CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); //findcontours()

    //draw bounding box around each contour
    //for(; contours! = 0; contours = contours->h_next)
    for(int i = 0; i < contours.size(); i++)
    {
        rect = boundingRect(contours[i]); //extract bounding box for current contour
        //drawing rectangle
        rectangle(currentFrame, cvPoint(rect.x, rect.y), cvPoint(rect.x+rect.width, rect.y+rect.height), cvScalar(0, 0, 255, 0), 2, 8, 0);                 
    }       

    //New Background
    convertScaleAbs(currentFrame_grey, oldFrame_grey, 1.0, 0.0);

    //display colour image with bounding box
    imshow("Output Image", currentFrame);//imshow()

    //display threshold image
    imshow("Difference image", differenceImg);//imshow()

    //clear memory and contours
    //cvClearMemStorage( storage );
    //contours = 0;
    contours.clear();

    //background = currentFrame;

    //press Esc to exit
    char c = cvWaitKey(33);
    if( c == 27 ) break;

}

// Destroy All Windows.
destroyAllWindows();

return 0;
}

请帮助解决此问题。

1 个答案:

答案 0 :(得分:0)

首先,我并没有真正想到使用alpha = 1.0调用accumulateWeighted。如果你在doc中查看accumulateWeighted的定义,你会看到alpha = 1.0它基本上相当于在每次迭代时将currentFrame复制到后台。

此外,它是一种累积功能,用于累积图像随时间变化到新图像中。如果您使用background = Mat::zeros(currentFrame.size(), CV_32FC3);重置每个循环的背景,那么它的兴趣是什么?

这就是说,你的代码中存在一个与函数的第四个参数有关的缺陷。你写了accumulateWeighted(currentFrame,background,1.0,NULL);。如果你查看documentation,你会发现第四个参数是一个Mask,并且是可选的。在此处传递NULL指针可能是您的异常的来源。你为什么不这样调用这个函数:accumulateWeighted(currentFrame,background,1.0);

希望这有帮助,