C++ 背景减法
我尝试使用按位_和背景减法器进行减法,但出现以下错误: 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行 代码: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
matframe1;
垫框遮罩;
bool bSuccess=cap.read(frame1);
if(!bsucces)//如果不成功,则中断循环
{
cout由于您的frame\u mask
不是CV\u 8U或CV\u 8S类型,因此引发错误
事实上,这行代码:correcate(frame1,frame\u mask,kernel)
frame\u mask
转换为CV\u 8UC3Mat
,因为输入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;
}