開源一個找信標燈的小程式
先申明一下,這裡只提供一個抗簡單雜光干擾的思路,而且還是沒寫完的,嘿嘿,我覺得剛做車想直接找程式碼的新人一定想打死我。
這個程式的想法是這樣的,我通過掃描多張影象,把影象中的一個個亮點存進數組裡,然後把多張影象裡一直存在的點濾掉,把那個忽隱忽現的點保留下來作為燈的位置點。但目前我感覺自己的想有法些問題,就沒有繼續寫下去。目前的進度是,我已經寫到了把多張影象裡的多個點存進陣列,但對濾掉一直存在的點那裡有些困惑,因為我想對於不同影象它同一個點的位置可能不一樣,雖然說信標燈的頻率好像是40hz,在有燈和沒燈這一個小小的時間間隔內,各個亮斑中心點的位置不大可能有大的變化,同時我們或許還可以採用設定幀率的攝像頭(我不確定這個設定幀率是否是時間均勻分佈的)來做這個事情,但終究我沒有去具體實踐過,我並不確定他的實際可行性,emmm,不做車了的老臘肉可以任性,我就不做了咋的。如果想要使用我這個程式碼,你只需要把我Center_point0,1,2,3幾個數組裡的值做一個比較就好了,嘿嘿,如果發現有bug可以和我一起交流。
#include "ImageProcessing.h"
#include "include.h"
int Center_point0[10][2] = { 0 };//記錄光斑中心點,可能存在記錄0個數據,1個數據,多個數據
int Center_point1[10][2] = { 0 };
int Center_point2[10][2] = { 0 };
int Center_point3[10][2] = { 0 };
extern uint8 imgbuff[CAMERA_SIZE]; //imgbuff是採集的緩衝區,img是解壓後的緩衝區。
extern uint8 img[CAMERA_H][CAMERA_W]; //imgbuff用於採集影象,img用於影象處理
//uint8 img1[CAMERA_H][CAMERA_W]; //對比處理
//uint8 img2[CAMERA_H][CAMERA_W]; //不存圖,存點
//uint8 img3[CAMERA_H][CAMERA_W];
static int k1 = 0, k2 = 0, k3 = 0, k = 0; //在只有一個點時多次取值,忽略閃爍,在有多個點時~~~
void IMAGE_PRO(void)
{
unsigned int i = 0, j = 0;
unsigned char *p = NULL;
int n;
int center_get = 0;
int left = 0, right = 0, middle = 0, width = 0, center_X = 0, center_Y = 0;
k = 0;
//解壓
img_extract((uint8 *)img, (uint8 *)imgbuff, CAMERA_H*CAMERA_W / 8);
//濾掉斷點
for (i = 0; i < CAMERA_H; i++) //濾掉斷點
{
p = &img[i][1];
while (p < &img[i][CAMERA_W - 1])
{
if (*(p - 1) == 0xff && *p == 0x00 && *(p + 1) == 0xff)
{
*p = 0xff;
}
else if (*(p - 1) == 0x00 && *p == 0xff && *(p + 1) == 0x00)
{
*p = 0x00;
}
p++;
}
}
// 將影象左右兩邊變黑適合計算
for (i = 0; i < 60; i++)
{
img[i][0] = img[i][79] = 0x00;
}
//提取中心點
while (1)
{
for (i = 0; i < CAMERA_H; i++)
{
//提取斑點中心
if (center_get == 2)
{//從中間向左右
if (img[i][middle] == 0xff)
{
img[i][middle] = 0x00;
for (j = middle - 1; j > 0; j--)
{
if (img[i][j] == 0x00)
{
left = j - 1;
break;
}
img[i][j] = 0x00;
}
for (j = middle + 1; j < CAMERA_W; j++)
{
if (img[i][j] == 0x00)
{
right = j - 1;
break;
}
img[i][j] = 0x00;
}
if ((right - left) > width)
{
width = right - left;
center_X = (right + left) / 2;
center_Y = i;
}
middle = (right + left) / 2;
left = 0;
right = 0;
}
//結束一個斑點
else
{
Center_point0[k][0] = center_X;//第0幅圖的第k個點的X座標
Center_point0[k][1] = center_Y;
center_get = 0;
k++;
break;//已獲取一箇中心點,開始下一次掃描
}
}
//找斑點
if (center_get == 0)
{
if (i == CAMERA_H - 1)
{
center_get = 3;
}
while (img[i][j] < &img[i][CAMERA_W - 1])
{
if (img[i][j] == 0x00 && img[i][j + 1] == 0xff && left == 0)
{
left = j + 1;
center_get = 1;
}
if (img[i][j] == 0xff && img[i][j + 1] == 0xff && center_get = 1)
{
width++; //有亮斑不為0,
//根據Image_Data_Black_spots[i]的大小判斷寬度
img[i][j] = 0x00;//掃描過的賦0
}
else if (img[i][j] == 0xff && img[i][j + 1] == 0x00 && center_get == 1)
{
img[i][j] = 0x00;//掃描過的賦0
right = j;
center_get = 2;
middle = (left + right) / 2;
break; //一次只掃一行中的一個斑點,退出第一次掃描
}
j++;
}
Center_point0[k][0] = middle;//第0幅圖的第k個點的X座標
Center_point0[k][1] = i;
}
}
//本幅圖已無斑點,退出迴圈
if (center_get == 3)
{
center_get == 0;
break;
}
}
}
void Flicker_recognition(void) //把一直存在的點濾掉
{
}
emmmm,其實我還有其他的一些想法,但沒有實踐過的東西就不寫出來了,還是不要坑人了~~~。