gpt4 book ai didi

image - 在 C++ 中使用 OpenCV 删除背景

转载 作者:行者123 更新时间:2023-12-02 17:51:05 34 4
gpt4 key购买 nike

抱歉,解释太长了。作为 Open 的新手,希望通过示例提供更多详细信息。

我的要求是找到 2 个静态图像的增量 ,为此我使用以下技术:

cv::Mat prevImg = cv::imread("prev.bmp");

cv::Mat currImg = cv::imread("curr.bmp");

cv::Mat deltaImg;
cv::absdiff(prevImg,currImg,deltaImg);

cv::namedWindow("image", CV_WINDOW_NORMAL);

cv::absdiff(prevImg,currImg,deltaImg);

cv::imshow("image", deltaImg);

deltaImg ,我得到了图像之间的差异, 但它还包括第一张图片的背景 .我知道我必须使用 删除背景背景减法器MOG2 ,但我无法理解此类的用法,因为大多数示例都是基于网络摄像头捕获的。

请注意,我的图像是静态的(桌面事件的屏幕截图)。

请指导我解决此问题,一些示例代码会有所帮助。

注意我想计算 RGB 中的增量。

详细说明:

图片位于: https://picasaweb.google.com/105653560142316168741/OpenCV?authkey=Gv1sRgCLesjvLEjNXzZg#

Prev.bmp:我的桌面的上一个屏幕截图

curr.bmp:我桌面的当前屏幕截图

prev.bmp 和 curr.bmp 之间的差异应该只是启动菜单图像,请找到下图:

增量图像应该只包含启动菜单,但甚至包含 prev.bmp 的背景图像,我想删除这个背景。

提前致谢。

最佳答案

计算后cv::absdiff您的图像包含更改其值的每个像素的非零值。所以你想使用所有改变的图像区域。

cv::Mat deltaImg;
cv::absdiff(currImg,prevImg,deltaImg);

cv::Mat grayscale;
cv::cvtColor(deltaImg, grayscale, CV_BGR2GRAY);

// create a mask that includes all pixel that changed their value
cv::Mat mask = grayscale>0;

cv::Mat output;
currImg.copyTo(output,mask);

以下是示例图片:

以前的:

enter image description here

当前的:

enter image description here

面具:

enter image description here

输出:

enter image description here

这是计算掩码之前 deltaImg 的附加图像:

enter image description here

如果前景像素与背景像素具有相同的值但属于其他一些“对象”,则会出现问题。您可以使用 cv::dilate运算符(后跟 cv::erode )来填充单个像素间隙。或者,如果您对更改的图像的所有其他部分也不感兴趣,您可能想要提取开始菜单的矩形。

关于image - 在 C++ 中使用 OpenCV 删除背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21374148/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com