0

私は背景減算を使用していて、内容を表示したいと思います。コードはメモリ例外のためにいつも破壊されているようです。エラーは、cvCopy関数にあるようです。それを理解できません。OPENCV奇妙なエラー

#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; 
} 
+0

エラーを貼り付けることができますか? –

+0

2つのビデオキャプチャを同じデバイスに適用しないのはなぜですか?私はそれをテストしたことはありませんが、cap1がデバイス0を "盗む"ため、常にcapがNULLポインタを返していると思われます。 –

答えて

1

CおよびC++ APIを混合する代わりに、可能であればC++ APIに固執することをお勧めします。単に行列をコピーするだけの場合は、Mat::clone()またはMat::copyTo()のいずれかを使用します。あなたがマスクを使用したいので、このようcopyToメンバ関数を使用します。助け

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

希望を!

+0

cvCpyはここでは問題ではありませんが、 "C++ APIを使用してください" –

+0

@IanMedeirosのためにアップに値します。ダブルキャプチャについての良い点が開きます。私はそれを気付かなかった(正直言って私はコメントされた "症状"のセクションを見ていた)。私はそれが非常に問題だと思います。 – mevatron

+0

アドバイスを本当に感謝します。私の目的は、背景を白い面にするときに人の顔を分離することです(バックグラウンドの減算がそれにつながる) マスクを適用すると、frame.copyTo()を使ってマスクを適用することはできません。代わりに、最後にコピーされた配列の末尾に入ります。 – user1026134