不能通过基于指针的访问像素强度来分割 RGB 图像
cannot Segment a RGB image by pointer based accessing pixel intensities
我定义了一个函数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);
}
相关文章:
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 访问和更改基于另一个图像的像素颜色-opencv c++
- OpenCV 访问像素的颜色值
- 如何在OpenCV Cuda(GpuMat)中访问像素
- 使用glgetTeximage()访问像素
- 如何在opencv C++中访问特定的超像素
- OpenCV VisualStudio,C 代码错误尝试访问像素
- 从SDL_Texture访问像素颜色
- 不能通过基于指针的访问像素强度来分割 RGB 图像
- 访问 openCV 中某个图像中所有像素的 RGB 值
- 如何使用OpenCV快速访问像素值C++
- 访问图像像素;MatIterator_<> 和 Mat::at 运算符的比较
- 提高 OpenCV 中垫像素访问的性能
- 如何访问指向 QWidget 像素的指针
- 在OpenCV Android中访问相机帧像素
- 快速像素访问 opencv
- OpenCV积分图像像素访问错误
- OpenCV单个像素访问