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

cannot Segment a RGB image by pointer based accessing pixel intensities

本文关键字:像素 访问 图像 RGB 分割 于指针 指针 不能      更新时间:2023-10-16

我定义了一个函数void segRgb(Mat &src, Mat &dst, Rect roi),使用它,我尝试通过简单地阈值化从R,G和B通道导出的集总像素强度来分割输入RGB图像的区域区域(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函数不起作用。不显示任何图像。实际上,segRgb内的循环不会继续。任何人都可以指出问题,调试我的代码位?谢谢!

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