gpt4 book ai didi

c++ - OpenCV (C++) 中 PNG 文件的 GrabCut 读取掩码

转载 作者:行者123 更新时间:2023-11-28 06:47:51 28 4
gpt4 key购买 nike

此功能的实现在 Python 中似乎非常简单,如下所示:http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html

然而,当我尝试在 C++ 中做完全相同的事情时,我得到了错误的参数错误(对于 grabcut 函数)。如何以正确的格式放置 mask 图像?
我是这方面的新手,所以如果有人能帮助我更好地理解,我将非常感激。谢谢你!这是我到目前为止所拥有的:

    Mat image;
image= imread(file);

Mat mask;
mask.setTo( GC_BGD );

mask = imread("messi5.png");

Mat image2 = image.clone();

// define bounding rectangle

cv::Rect rectangle(startX, startY, width, height);
cv::Mat result; // segmentation result (4 possible values)
cv::Mat bgModel,fgModel; // the models (internally used)

//// GrabCut segmentation that works, but with a rectangle, not with the mask I need
//cv::grabCut(image, // input image
// result, // segmentation result
// rectangle,// rectangle containing foreground
// bgModel,fgModel, // models
// 1, // number of iterations
// cv::GC_INIT_WITH_RECT); // use rectangle


grabCut( image, mask, rectangle, bgModel, fgModel, 1, GC_INIT_WITH_MASK);


cv::compare(mask,cv::GC_PR_FGD,mask,cv::CMP_EQ);
cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(foreground,mask); // bg pixels not copied

namedWindow( "Display window", WINDOW_AUTOSIZE );
imshow( "Display window", foreground );
waitKey(0);

return 0;

最佳答案

看来您误解了指南,在此处从问题中的链接指南中重复了一遍:

   # newmask is the mask image I manually labelled
newmask = cv2.imread('newmask.png',0)

# whereever it is marked white (sure foreground), change mask=1
# whereever it is marked black (sure background), change mask=0
mask[newmask == 0] = 0
mask[newmask == 255] = 1

mask, bgdModel, fgdModel = cv2.grabCut(img,mask,None,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_MASK)

mask = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask[:,:,np.newaxis]
plt.imshow(img),plt.colorbar(),plt.show()

恐怕这不是你所做的。首先,您似乎已将 mask 设置为 rgb 图像:

   mask = imread("messi5.png");  

而 is 应该设置为蒙版图像:

   mask = imread("newmask.png",CV_LOAD_IMAGE_GRAYSCALE);  

根据评论编辑:

来自在图像上绘制的纯红色蒙版(实际蒙版会更好)。

 maskTmp = imread("messi5.png"); 
std::vector<cv::Mat> channels(3)
split( messi5, channels);
cv::Mat maskRed = channels[2];

现在在红色 channel 上设置阈值以获取二进制掩码。

关于c++ - OpenCV (C++) 中 PNG 文件的 GrabCut 读取掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627406/

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