1. 程式人生 > >開源一個找信標燈的小程式

開源一個找信標燈的小程式

先申明一下,這裡只提供一個抗簡單雜光干擾的思路,而且還是沒寫完的,嘿嘿,我覺得剛做車想直接找程式碼的新人一定想打死我。

這個程式的想法是這樣的,我通過掃描多張影象,把影象中的一個個亮點存進數組裡,然後把多張影象裡一直存在的點濾掉,把那個忽隱忽現的點保留下來作為燈的位置點。但目前我感覺自己的想有法些問題,就沒有繼續寫下去。目前的進度是,我已經寫到了把多張影象裡的多個點存進陣列,但對濾掉一直存在的點那裡有些困惑,因為我想對於不同影象它同一個點的位置可能不一樣,雖然說信標燈的頻率好像是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,其實我還有其他的一些想法,但沒有實踐過的東西就不寫出來了,還是不要坑人了~~~。