我有一个二进制图像数据,大小为1280(宽)x1024(长)。数据存储在名为" CamBuff"的1d数组中。尺寸为1280 * 1024。
Image is something like this:| 0 1 2... 1278 1279 |
|1280... 2559 |
|. . . . |
|. . . . 1310719 |
CamBuff: [ 0 1 2.... 1279 1280 ... 1310719]
图像数据应该只包含0和1,因为它是二进制图像数据(假设background = 0,object = 1)。
图像中有一个物体,我想找到它的中心位置。
我想到这样的事情(找到对象的宽度,但可能这是错误的):
int width = 1280;
int height = 1024;
int a = 0;
int b = 0;
int c, startrow, startcol, endrow, endcol, objectwidth, objectheight;
int h = 1;
int widthstart = 0;
int colstart = 0;
for (int i=0; i<height; i++)
{
for(int k=0; k<width; k++)
{
a = CamBuff[k];
b = CamBuff[h];
c = b - a;
if(c != 0 && widthstart == 0)
{
startrow = h;
widthstart = 1;
}
if(c != 0 && widthstart == 1)
{
endrow = k;
widthstart = 0;
}
h++;
objectwidth = (endrow - startrow)*0.5;
}
}
如果有变化(从背景到对象,反之亦然),c!= 0
如何找到对象的x和y中心位置?
答案 0 :(得分:1)
如果你想要一个表格的重心。您必须累积要保留的像素的所有位置,并除以这些像素的数量。
类似下面的代码将为您提供解决方案。
代码没有经过测试而且没有编译,我试图用你的符号取代Backgound的值为backgound(在你的情况下为0)
const size_t acc_x=0, acc_y=0;
for (int i=0; i<height; i++)
{
for(int k=0; k<width; k++)
{ if( image[i*width+k] != Backgound )
{
acc_x += k
acc_y += i;
++counter
}
}
}
const size_t barycenter_x = acc_x / counter;
const size_t barycenter_y = acc_y / counter;
答案 1 :(得分:0)
您可以尝试为其创建数组 宽度和高度。然后检查每一行中对象的中间位置(对象的中间位于其中的“1”)并将其放入数组中。和列相同的事情。 创建2个阵列后,您可以通过计算宽度和高度数组的平均值来计算该点。祝你好运