所以我在 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 给出相同的输出。任何帮助深表感谢。提前致谢!