无法通过基于指针的访问像素强度来分割RGB图像

时间:2019-01-26 20:58:01

标签: c++ opencv

我定义一个函数private static void printReverse(String str, int i) { if (i >= str.length()) { return; } System.out.print(str.charAt(str.length() - i++ - 1)); printReverse(str, i); } ,通过该函数,我尝试通过简单地对从R,G和B通道得出的集总像素强度进行阈值化来分割输入RGB图像的区域(ROI)。下面是该函数的代码:

void segRgb(Mat &src, Mat &dst, Rect roi)

以下是我对该功能的测试代码:

void segRgb(Mat &src, Mat &dst, Rect roi)
{
  uchar *bgrdata = src.data;
  uchar *outdata = dst.data;

  int ystart  = roi.y;
  int yend    = roi.y + roi.height;
  int xstart  = roi.x;
  int xend    = roi.x+roi.width;
  int step1   = src.cols-roi.width;
  int step3   = 3*step1;
  int start1  = roi.y*src.cols+roi.x;
  int start3  = 3*start1;

  bgrdata += start3;
  outdata += start1;

  uchar r, g, b;
  double  score=0.0;

  for(int i=ystart; i<yend; i++)
  {
      qDebug()<<"Rows: "<<i;
    for(int j=xstart; j<xend; j++)
    {
      b = *bgrdata++;
      g = *bgrdata++;
      r = *bgrdata++;
      score = 0.21*r+0.72*g+0.07*b; //a simple rule to lump RGB values
      if(score>100)
      {
        *outdata = 255;
      }
      else
      {
        *outdata = 0;
      }

      outdata++;
    }
    outdata+=step1;
    bgrdata+=step3;
  }
}

我运行上面的代码。函数Rect cvRect = Rect(10,50,256,256); Mat dst; segRgb(im, dst, cvRect); //im is a loaded Matrix of 427*640*3, CV_8UC3 namedWindow("Thresholded"); imshow("Thresholed", dst); 由于某些原因无法正常工作。没有显示图像。实际上,segRgb内部的循环不会继续进行。任何人都可以指出问题,调试我的代码吗?谢谢!

1 个答案:

答案 0 :(得分:1)

void segRgb(Mat &src, Mat &dst, Rect roi)
{
    uchar *bgrdata = src.data;
    uchar *outdata = dst.data;

    int ystart = roi.y;
    int yend = roi.y + roi.height;
    int xstart = roi.x;
    int xend = roi.x + roi.width;
    int step1 = src.cols - roi.width;
    int step3 = 3 * step1;
    int start1 = roi.y*src.cols + roi.x;
    int start3 = 3 * start1;

    bgrdata += start3;
    outdata += start1;

    uchar r, g, b;
    double  score = 0.0;

    for (int i = ystart; i < yend; i++)
    {
        cout << "Rows: " << i;
        for (int j = xstart; j < xend; j++)
        {   
            b = *bgrdata++;
            g = *bgrdata++;
            r = *bgrdata++;
            score = 0.21*r + 0.72*g + 0.07*b; //a simple rule to lump RGB values
            if (score > 100)
            {
                *outdata = 255;
            }
            else
            {
                *outdata = 0;
            }

            outdata++;
        }
        outdata += step1;
        bgrdata += step3;
    }
}

int main() {
    Mat im = imread("urimage");
    Rect cvRect = Rect(10, 50, 256, 256);
    // you have to allocate a size for the dst Mat otherwise the uchar* output you point to above will be garbage
    Mat dst(im.size(),im.type());
    segRgb(im, dst, cvRect); //im is a loaded Matrix of 427*640*3, CV_8UC3
    //Resize you dst or you can change a bit in your function paramters  to get it directly
   dst=Mat(dst, cvRect);
    namedWindow("Thresholded");
    imshow("Thresholed", dst);
    waitKey(0);
}