2017-02-26 54 views
0

我已经利用OpenCV GrabCut功能来执行图像分割。按照以下代码查看分段图像时,分段是合理的/正确的。但是,在查看(试图使用)segmrntation掩码值时,我得到了一些非常大的数字,而不是人们期望从枚举值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); 
} 

为什么当分割定性地正确时,人们会在枚举之外得到数字?

回答

0

我对你//Write mask.一步怀疑,为什么你再次重申了res和修改maskPtrmaskPtr[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) << ", "; 
    } 
} 

当你迭代单通道垫您必须ü se res.at<uchar>(i, j)而不是res.at<cv::GrabCutClasses>