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
C++ 背景减法_C++_Opencv_Background Subtraction - Fatal编程技术网

C++ 背景减法

C++ 背景减法,c++,opencv,background-subtraction,C++,Opencv,Background Subtraction,我尝试使用按位_和背景减法器进行减法,但出现以下错误: OpenCV错误:断言失败((mtype==CV_8U | | mtype==CV_8S)&& _cv::binary\u op文件C:\build\master\u winpack-build-win64-vc14\opencv\modules\core\src\arithm.cpp中的mask.sameSize(*psrc1)), 第241行 代码: matframe1; 垫框遮罩; bool bSuccess=cap.read(fra

我尝试使用按位_和背景减法器进行减法,但出现以下错误:

OpenCV错误:断言失败((mtype==CV_8U | | mtype==CV_8S)&& _cv::binary\u op文件C:\build\master\u winpack-build-win64-vc14\opencv\modules\core\src\arithm.cpp中的mask.sameSize(*psrc1)), 第241行

代码:

matframe1;
垫框遮罩;
bool bSuccess=cap.read(frame1);
if(!bsucces)//如果不成功,则中断循环
{

cout由于您的
frame\u mask
不是CV\u 8UCV\u 8S类型,因此引发错误

事实上,这行代码:
correcate(frame1,frame\u mask,kernel)

frame\u mask
转换为CV\u 8UC3
Mat
,因为输入
Mat
frame1
)的类型为CV\u 8UC3


无论如何,我不太明白您想用
按位\u和
操作做什么,所以我举了一个简单的例子来说明正确的方法:

int main(int argc, char** argv)
{
    Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();

    VideoCapture cap = VideoCapture(0);
    Mat frame1, frame_mask;

    while (cap.isOpened())
    {
        cap.read(frame1);
        pMOG2->apply(frame1, frame_mask);

        Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); // erode filter's kernel
        erode(frame_mask, frame_mask, kernel);

        Mat movingAreas;
        frame1.copyTo(movingAreas, frame_mask);

        imshow("movingParts", movingAreas);

        keyCode = waitKey(1);
        if (keyCode == 27 || keyCode == 'q' || keyCode == 'Q')
            break;
    }

    return 0;
}
int main(int argc,char**argv)
{
Ptr pMOG2=createBackgroundSubtractorMOG2();
视频捕获上限=视频捕获(0);
垫框1,框_掩模;
while(cap.isOpened())
{
第二章(第1章);
pMOG2->apply(帧1,帧屏蔽);
Mat kernel=getStructuringElement(变形椭圆,大小(3,3));//腐蚀过滤器的内核
腐蚀(框架屏蔽、框架屏蔽、内核);
垫移动区域;
帧1.复制到(移动区域、帧屏蔽);
imshow(“移动部件”,移动区域);
keyCode=waitKey(1);
if(keyCode==27 | | keyCode=='q'| | keyCode=='q')
打破
}
返回0;
}
结果如下:


希望有帮助!

从错误中可以看出,您的源和掩码大小不一样,或者掩码不是8位。您试图做的事情不清楚,是否只保留移动的对象,如下图所示?@ElouanLine是的,我正在尝试这样做this@KhouriGiordano它们有相同的尺寸-640x480,在我的代码中我做了一些类似这样的事情:Mat FraskStask[Frase.siZe(),CVY8UC1),但是我仍然有这个错误:(@ kUPYP28 NP,如果它对你有帮助的话,考虑接受这个答案)对不起,我还有一个问题。我想在这个(左下角)中有一个效果。我该怎么办?@ KUPY28。我看不到左下角的任何效果(题为“面具”)。.你能进一步解释吗?好的,这段视频的背景一直是黑色的,我们只看到手,对吗?在开始我的代码后,我得到了这个@kuppy28,我有点困惑。你想要的效果正是我在回答中解释的。你试过编译我的代码片段吗?
int main(int argc, char** argv)
{
    Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();

    VideoCapture cap = VideoCapture(0);
    Mat frame1, frame_mask;

    while (cap.isOpened())
    {
        cap.read(frame1);
        pMOG2->apply(frame1, frame_mask);

        Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); // erode filter's kernel
        erode(frame_mask, frame_mask, kernel);

        Mat movingAreas;
        frame1.copyTo(movingAreas, frame_mask);

        imshow("movingParts", movingAreas);

        keyCode = waitKey(1);
        if (keyCode == 27 || keyCode == 'q' || keyCode == 'Q')
            break;
    }

    return 0;
}