2017-02-26 3 views
0

私はOpenCV GrabCut機能を利用して画像のセグメンテーションを行ってきました。以下のコードに従ってセグメント化されたイメージを表示すると、セグメント化は合理的/正確です。しかし、(使用しようとすると)マスクマスク値を見ると、非常に大きな数値が得られており、列挙値はcv::GrabCutClasses列挙型ではありません。セグメンテーションは質的に正しいときにOpenCV GrabCutマスク

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.ステップに疑問

答えて

0

は、なぜ基本的にすでにres変数に格納された単一チャネルのバイナリイメージを持っている、あなたはresを再反復処理し、maskPtr[idx].x = (classification == cv::GC_PR_FGD) ? 255 : 0;としてmaskPtrを修正行い、cv::compare()は、バイナリイメージを返し

しかし、あなたはまだ、反復して値をデバッグしたい場合は、あなたのように単一チャンネルの画像を反復するための標準的な技術を使用する必要があります:あなたはuの必要があり、単一のチャンネルマットを反復されると

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) << ", "; 
    } 
} 

se res.at<uchar>(i, j)で、res.at<cv::GrabCutClasses>ではありません。

関連する問題