簡體   English   中英

OpenCV GrabCut面膜

[英]OpenCV GrabCut Mask

我已經利用OpenCV GrabCut功能執行圖像分割。 當按照下面的代碼查看分割的圖像時,分割是合理/正確的。 但是,當查看(嘗試使用)segmrntation掩碼值時,我得到了一些非常大的數字,而不是cv::GrabCutClasses枚舉所期望的枚舉值。

void doGrabCut(){
        Vector2i imgDims = getImageDims();

        //Wite image to OpenCV Mat.
        const Vector4u *rgb = getRGB();
        cv::Mat rgbMat(imgDims.height, imgDims.width, CV_8UC3);
        for (int i = 0; i < imgDims.height; i++) {
            for (int j = 0; j < imgDims.width; j++) {
                int idx = i * imgDims.width + j;
                rgbMat.ptr<cv::Vec3b>(i)[j][2] = rgb[idx].x;
                rgbMat.ptr<cv::Vec3b>(i)[j][1] = rgb[idx].y;
                rgbMat.ptr<cv::Vec3b>(i)[j][0] = rgb[idx].z;
            }
        }

        //Do graph cut.
        cv::Mat res, fgModel, bgModel;
        cv::Rect bb(bb_begin.x, bb_begin.y, bb_end.x - bb_begin.x, bb_end.y - bb_begin.y);
        cv::grabCut(rgbMat, res, bb, bgModel, fgModel, 10, cv::GC_INIT_WITH_RECT);
        cv::compare(res, cv::GC_PR_FGD, res, cv::CMP_EQ);

        //Write mask.
        Vector4u *maskPtr = getMask();//uchar
        for (int i = 0; i < imgDims.height; i++) {
            for (int j = 0; j < imgDims.width; j++) {
                cv::GrabCutClasses classification = res.at<cv::GrabCutClasses>(i, j);
                int idx = i * imgDims.width + j;
                std::cout << classification << std::endl;//Strange numbers here.
                maskPtr[idx].x = (classification == cv::GC_PR_FGD) ? 255 : 0;//This always evaluates to 0.
            }
        }

        cv::Mat foreground(rgbMat.size(), CV_8UC3, cv::Scalar(255, 255, 255));
        rgbMat.copyTo(foreground, res);
        cv::imshow("GC Output", foreground);
}

當定性正確時,為什么人們會在枚舉之外獲得數字?

我懷疑您的//Write mask. 步驟,為什么要重新迭代res並將maskPtr修改為maskPtr[idx].x = (classification == cv::GC_PR_FGD) ? 255 : 0; maskPtr[idx].x = (classification == cv::GC_PR_FGD) ? 255 : 0; ,基本上您已經在res變量中存儲了一個通道的二進制圖像, cv::compare()返回一個二進制圖像

但是,如果您仍想通過迭代調試值,則應使用標准技術來迭代單個通道圖像,如下所示:

for (int i = 0; i < m.rows; i++) {
    for (int j = 0; j < m.cols; j++) {
        uchar classification = res.at<uchar>(i, j);
        std::cout << int(classification) << ", ";
    }
}

在迭代單個通道墊時,必須使用res.at<uchar>(i, j)而不是res.at<cv::GrabCutClasses>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM