Image processing OPENCV异常错误

Image processing OPENCV异常错误,image-processing,opencv,webcam,out-of-memory,background-subtraction,Image Processing,Opencv,Webcam,Out Of Memory,Background Subtraction,我正在使用背景减法,希望显示内容。不知何故,由于内存异常,代码似乎一直在中断。错误似乎在cvCopy函数中。我想不出来 #include "cv.h" #include "highgui.h" #include "opencv2\core\operations.hpp" #include "opencv2\core\core.hpp" #include "opencv2\core\types_c.h" #include "opencv\cxcore.h" #include <opencv2

我正在使用背景减法,希望显示内容。不知何故,由于内存异常,代码似乎一直在中断。错误似乎在cvCopy函数中。我想不出来

#include "cv.h"
#include "highgui.h"
#include "opencv2\core\operations.hpp"
#include "opencv2\core\core.hpp"
#include "opencv2\core\types_c.h"
#include "opencv\cxcore.h"
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int, char**)
{
    bool flag=0;
    VideoCapture cap(0); // open the default camera
    VideoCapture cap1(0);
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat gray,bg,result,frame,result1,final,frame1;
    //CvMemStorage*     contours = NULL;

    cap>>frame;
    cvtColor(frame,bg,CV_BGR2GRAY);

    namedWindow("GRAY",1);

    for(;;)
    {
        //final = Mat::zeros(mGreenScale.rows, mGreenScale.cols, CV_8UC3);
        cap >> frame; // get a new frame from camera
        cap1 >> frame1;
        cvtColor(frame, gray, CV_BGR2GRAY);
        absdiff(gray,bg,result);
        threshold(result,result1,50,255,THRESH_BINARY);
        //cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL)¶
        //cvCopy(&frame1, &final, &result1);
        //findContours(result1,contours, ;CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
        //drawContours(final,contours,-1,CV_RGB(0,255,0));
        //imshow("GRAY",result1);
        //imshow("GRAY", result);
        imshow("GRAY1",final);

        if(flag)
        {
            imshow("BG",bg);
        }
        //if(waitKey(0)==27) break;
        if(waitKey(1)==32) 
        {
            cvtColor(frame,bg,CV_BGR2GRAY);
            flag=!flag;
        }
        if(waitKey(1)==27) 
        {
            break;
        }
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}
#包括“cv.h”
#包括“highgui.h”
#包括“opencv2\core\operations.hpp”
#包括“opencv2\core\core.hpp”
#包括“opencv2\core\types\u c.h”
#包括“opencv\cxcore.h”
#包括
使用名称空间cv;
使用名称空间std;
int main(int,char**)
{
布尔标志=0;
VideoCapture cap(0);//打开默认摄像机
视频捕获cap1(0);
if(!cap.isopend())//检查我们是否成功
返回-1;
Mat gray,背景,结果,帧,结果1,最终,帧1;
//CvMemStorage*等高线=空;
cap>>框架;
CVT颜色(边框、背景、背景灰);
namedWindow(“灰色”,1);
对于(;;)
{
//final=Mat::零(mGreenScale.rows、mGreenScale.cols、CV_8UC3);
cap>>帧;//从相机获取新帧
cap1>>框架1;
CVT颜色(边框、灰色、CV_BGR2灰色);
absdiff(灰色、背景、结果);
阈值(结果,结果1,50255,阈值二进制);
//cvCopy(const-CvArr*src,CvArr*dst,const-CvArr*mask=NULL)
//cvCopy(框架1、最终版和结果1);
//查找轮廓(结果1、轮廓、CV_RETR_CCOMP、CV_CHAIN_APPROX_SIMPLE);
//绘制等高线(最终等高线,-1,CV_RGB(0255,0));
//imshow(“灰色”,结果1);
//imshow(“灰色”,结果);
imshow(“灰色1”,最终版);
国际单项体育联合会(旗)
{
imshow(“BG”,BG);
}
//如果(等待键(0)=27)中断;
如果(等待键(1)=32)
{
CVT颜色(边框、背景、背景灰);
flag=!flag;
}
如果(等待键(1)=27)
{
打破
}
}
//摄像机将在VideoCapture析构函数中自动解除初始化
返回0;
}

> p>而不是混合C和C++ API,我建议您尽可能地坚持C++ API。如果您只想复制矩阵,只需使用或。由于要使用掩码,请像下面这样使用
copyTo
成员函数:

Mat final;
frame1.copyTo(final, result1);

希望有帮助

你能粘贴错误吗?为什么要在同一台设备上截取两个视频?我从未测试过它,但我真的怀疑cap总是返回空指针,因为cap1正在“窃取”设备0。你能调试它吗?CVCPY不是这里的问题,但值得一提,因为“坚持用C++ API”@ IANMEDEIROS的好点关于双捕获打开。我没有注意到(说实话,我只是在看注释掉的“症状”部分:)我想这就是问题所在。非常感谢你的建议。我的目标是,当我选择背景为白色表面时,隔离人们的脸(背景减法会导致这种情况),应用遮罩不会使用frame.copyTo()实现这一点。相反,我在复制的数组中得到了尾随。你最后的评论对我来说毫无意义。