所以我在 3 天前选择了 OpenCV。总新手。我在网上下载了代码来实现Lazy Snapping,这是一个类似于Grabcut的图片裁剪工具。我以为这是一个 C++ 项目,但大部分代码都是用 C 风格编写的,并且直到掩码创建部分才完成。我想扩展它以在原始图像上应用蒙版并剪切前景并将其粘贴到不同的图像中。
我找不到太多关于 C 的帮助。所以我保存了掩码并使用 Mat (C++) 读取它。这是一个小代码片段:
cvSaveImage("Mask.jpg",mask);
cvSaveImage("Object_Marking_Output.jpg",showImg);
cvSaveImage("Original.jpg",original);
Mat masky = imread("Lazy Snapping/mask.jpg", 1);
Mat showImg1 = imread("Lazy Snapping/Original.jpg", 1);
Mat crop(showImg1.rows, showImg1.cols, CV_8UC3);
//Though the mask appears black and white I kept getting errors
//This convert code helped it go away. I could recreate the error if necessary
cvtColor(masky,masky,CV_RGB2GRAY);
//I resize it because the mask created is smaller
cv::resize(masky, masky, showImg1.size());
showImg1.copyTo(crop, masky);
//bitwise_and(showImg1, cv::Scalar(255,255,255), crop, masky);
// normalize so imwrite(...)/imshow(...) shows the mask correctly!
normalize(masky.clone(), masky, 0.0, 255.0, CV_MINMAX, CV_8UC1);
// show the images
imshow("Mask used to apply on image", masky);
imshow("Lazy snapped output", crop);
但是我的输出看起来很奇怪。我正在尝试取下头上的毛巾,将其他所有东西都当作背景。创建的面具是完美的,只勾勒出毛巾的轮廓。但是,当将它应用于输入图像时,我在输出图像上得到了这些额外的背景散射位(它不允许我直接发布图像。所以这是一个保管箱链接):
https://www.dropbox.com/sh/z4u22n9yyfhcnpx/AAA8QxU9tkLGgEEyS_2QFuG2a
我不知道为什么会这样,因为从我在论坛上阅读的教程和答案来看,这似乎是正确的方法。 copyTo 和 bitwise_and 给出相同的输出。任何帮助深表感谢。提前致谢!
最佳答案
那些“洞”已经在你的蒙版 img 中了(如果你有一些带有吸管工具的 imgviewer,你可以自己检查一下,resp.parts 不是完全黑色的,而是像 0x020202,所以蒙版在那个区域失败了)
所以,
threshold(masky,masky, 120,255, 0);
你的形象,所以它是完美的“二进制”
PS.: 避免将类似的东西保存为 jpg。你的问题看起来像是一个压缩/插值人工制品
关于c++ - 在图像上应用蒙版以裁剪前景会产生不完整的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23928047/