【发布时间】:2017-03-25 17:43:02
【问题描述】:
我正在使用 OpenCV 来处理一些图像。
假设image.png 是黑白图像(仅B 或W 用于像素颜色)。
例如,如果我们打印第三行的颜色,它可能是:
WWWWWBBBWWWWWWBBBBBBWWWWWBBWWWW
我想保存每个黑色像素序列的信息,我的意思是,我希望能够为每一行计算值:
number of black sequences in row i:(以上示例为3)
x-coordinate of end pixels for each black sequence in row i:(以上示例中的6,8 和15,20 和26,27)
length of each black sequence on row i:(以上示例中的l1=3,l2=6,l3=2)(假设上述项目已完成,这很容易)
我正在使用一些for 循环并测试颜色是否为黑色。当它为黑色时,我保存x 坐标并在内部启动其他循环以从该坐标运行到行尾,测试颜色是否为白色。当它找到白色时,它会停止并保存之前的坐标。
这仅用于计算第一个黑色像素序列的长度。我不知道下一步该怎么走(我什至不知道有多少)。
这是代码的主要部分(带有一些垃圾代码):
for(int y=0;y<img.rows;y++) //img.rows
{
for(int x=0;x<img.cols;x++)
{
Vec3b color = image.at<Vec3b>(Point(x,y));
printf("(%d,%d,%d)\n",color[1],color[2],color[3]);
if(color[0] == 0 && color[1] == 0 && color[2] == 0)
{
cor[0]='B';
ymax = y;
if (ymin == -1) { ymin = y; }
int xmin = x;
int diam_esq = img.cols/2-xmin;
double dist_esq = sqrt( (x-img.cols/2)*(x-img.cols/2) + (y-img.rows/2)*(y-img.rows/2) );
for(int z=x;z<img.cols;z++)
{
Vec3b colorz = image.at<Vec3b>(Point(z,y));
if(colorz[0] == 255 && colorz[1] == 255 && colorz[2] == 255)
{
int xmax = z-1;
int diam_dir = xmax-img.cols/2;
double dist_dir = sqrt( (z-1-img.cols/2)*(z-1-img.cols/2) + (y-img.rows/2)*(y-img.rows/2) );
int diam = xmax - xmin;
//printf("y=%*d, xmin=%*d, xmax=%*d, esq=%*d, dir=%*d, diam=%*d\n",5,y,5,xmin,5,xmax,5,diam_esq,5,diam_dir,5,diam);
printf("%*d%*d%*d%*d%*d%*d%*f%*f\n",5,y,5,xmin,5,xmax,5,diam_esq,5,diam_dir,5,diam,13,dist_esq,13,dist_dir);
break;
}
}
break;
}
}
//break; // only y=0
}
【问题讨论】: