所以我3天前拿起了OpenCV。完全的新手。我从网上下载了代码来实现Lazy snaps,这是一个与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);
然而,我的输出看起来很奇怪。我正在试着把头上的毛巾拿掉,把其他的东西都当作背景。制作出来的面膜非常完美,只勾勒出毛巾的轮廓。然而,当将其应用于输入图像时,我在输出图像上得到了这些额外的背景分散位(它不允许我直接发布图像)。这是dropbox的链接):
https://www.dropbox.com/sh/z4u22n9yyfhcnpx/AAA8QxU9tkLGgEEyS_2QFuG2a我不知道为什么会发生这种情况,因为从教程和答案我一直在论坛上阅读,它看起来像正确的方式去。copyTo和bitwise_and给出相同的输出。非常感谢任何帮助。提前感谢!
这些'孔'已经在您的遮罩img(如果您有一些imgviewer与移液器工具,您可以自己检查,结果如下:部分不是完全黑色,而是像0x020202,所以在该区域屏蔽失败)
threshold(masky,masky, 120,255, 0);
你的图像,所以它是完美的'二进制'
p。避免将这类文件保存为jpg格式。你的问题看起来像是一个压缩/插值伪影