在使用位置上具有关联性的一排传感器时,如果直接使用二值化算法进行定位,往往只能获得比较低的分辨率。在控制性能上并不高。
但是分辨率其实不仅仅和横向分辨率有关,也可以和纵向分辨率(传感器分辨率位数)有关,下面就分享一个简单的超分辨率定位算法,常见的应用场景就是寻迹
- // 可以统计一段灰度图像中的数值峰值出现位置,返回更加精确的位置
- float F_Get_Image_Summit(u16 *img, u16 img_size)
- {
- u32 add_sum = 0, add = 0; // 带有数值的累加
- u8 img_cnt = 0;
- for (img_cnt = 0; img_cnt < img_size; img_cnt++)
- {
- add_sum += img_cnt * img[img_cnt];
- add += img[img_cnt];
- }
- if (add == 0)
- return (float)(img_size / 2);
- return ((float)add_sum / (float)add);
- }
复制代码
这里给出一段示例代码,使用的数据是一串灰度图像,通过对每个数值乘以位置系数,并且累加后求均值,即可获得一个位置相关的精确定位点。
这里使用一个简单的测试代码来实验效果
- int test_dat[] = { 2,2,5,9,2,2 };
-
- int main()
- {
- printf("数组返回的峰值位置为:%f", F_Get_Image_Summit(test_dat, 6));
- }
复制代码
可以看到返回的位置为2.59左右,符合数组内的位置值(5和9之间且偏9的位置一些)
|