博客專欄

        EEPW首頁 > 博客 > MLX90640 紅外熱成像儀測溫模塊開發筆記(四)

        MLX90640 紅外熱成像儀測溫模塊開發筆記(四)

        發布人:河北穩控科技 時間:2022-07-22 來源:工程師 發布文章

        MLX90640 紅外熱成像儀測溫模塊開發筆記(四)損壞和不良像素的處理 

        如前“開發筆記(一)”所說,MLX90640 可能存在不超過 4 個像素的損壞或者不良像素,在溫度計算過程完成后,這些不良像素點會得到錯誤的溫度數據,對于處理這些不良數據 MLX 也給出了推薦方法和具體的函數。(其實就是找相鄰的正常的溫度數據取平均來代替不良數據) 

         紅外成像儀效果圖去二維碼.png


        前面開發筆記(一)的內容中所說的 API 庫,里面缺少了對不良像素點的處理函數,在這里補上。 

        int CheckAdjacentPixels(uint16_t pix1, uint16_t pix2)

        {

        int pixPosDif;


        pixPosDif = pix1 - pix2;

        if(pixPosDif > -34 && pixPosDif < -30)

        {

        return -6;

        }

        if(pixPosDif > -2 && pixPosDif < 2)

        {

        return -6;

        }

        if(pixPosDif > 30 && pixPosDif < 34)

        {

        return -6;

        }


        return 0;

        }


        float GetMedian(float *values, int n)

        {

        float temp;


        for(int i=0; i<n-1; i++)

        {

        for(int j=i+1; j<n; j++)

        {

        if(values[j] < values[i])

        {

        temp = values[i]; values[i] = values[j]; values[j] = temp;


        }

        }


        if(n%2==0)

        {

        return ((values[n/2] + values[n/2 - 1]) / 2.0);


         

        }

        else

        {


        }

         





        return values[n/2];

         


        }


        int IsPixelBad(uint16_t pixel,paramsMLX90640 *params)

        {

        for(int i=0; i<5; i++)

        {

        if(pixel == params->outlierPixels[i] || pixel == params->brokenPixels[i])

        {

        return 1;

        }

        }


        return 0;

        }

        void MLX90640_BadPixelsCorrection(uint16_t *pixels, float *to, int mode, paramsMLX90640

        *params)

        {

        float ap[4]; uint8_t pix; uint8_t line; uint8_t column;


        pix = 0;

        while(pixels[pix] != 0xFFFF)

        {

        line = pixels[pix]>>5;

        column = pixels[pix] - (line<<5);


        if(mode == 1)

        {

        if(line == 0)

        {

        if(column == 0)

        {

        to[pixels[pix]] = to[33];

        }

        else if(column == 31)

        {

         


        }

        else

        {


        }

        }

         

        to[pixels[pix]] = to[62];





        to[pixels[pix]] = (to[pixels[pix]+31] + to[pixels[pix]+33])/2.0;

         

        else if(line == 23)

        {

        if(column == 0)

        {

        to[pixels[pix]] = to[705];

        }

        else if(column == 31)

        {

         


        }

        else

        {


        }

        }

         

        to[pixels[pix]] = to[734];





        to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]-31])/2.0;

         

        else if(column == 0)

        {

        to[pixels[pix]] = (to[pixels[pix]-31] + to[pixels[pix]+33])/2.0;

        }

        else if(column == 31)

        {

         


        }

        else

        {

         

        to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]+31])/2.0;





        ap[0] = to[pixels[pix]-33];

        ap[1] = to[pixels[pix]-31]; ap[2] = to[pixels[pix]+31]; ap[3] = to[pixels[pix]+33];

        to[pixels[pix]] = GetMedian(ap,4);



        }

        else

        {

         

        }





        if(column == 0)

        {

         

        to[pixels[pix]] = to[pixels[pix]+1];

        }

        else if(column == 1 || column == 30)

        {

        to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;

        }

        else if(column == 31)

        {

         


        }

        else

        {


        0)

         

        to[pixels[pix]] = to[pixels[pix]-1];





        if(IsPixelBad(pixels[pix]-2,params) == 0 && IsPixelBad(pixels[pix]+2,params) ==


        {

        ap[0] = to[pixels[pix]+1] - to[pixels[pix]+2]; ap[1] = to[pixels[pix]-1] - to[pixels[pix]-2];

        if(fabs(ap[0]) > fabs(ap[1]))

        {

         









        }

        else

        {

         


        }

        else

        {


        }

         

        to[pixels[pix]] = to[pixels[pix]-1] + ap[1];





        to[pixels[pix]] = to[pixels[pix]+1] + ap[0];

         

        to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;

        }

        }

        }

        pix = pix + 1;

        }

        }

        用法很簡單,在開發筆記(三)MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp);之后添加兩行即可。如下(斜體是添加的內容):

        ……

        MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp); MLX90640_BadPixelsCorrection(MLXPars.brokenPixels, Temp, 1, MLXPars); MLX90640_BadPixelsCorrection(MLXPars.outlierPixels, Temp, 1, MLXPars);

        ……

        /*

        經過上面的處理后,Temp 中的損壞和不良像素點已經處理,Temp 數組中是處理完成后的

        768 個溫度值。

        */


        紅外成像儀效果圖2.png成果展示。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。




        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平顶山市| 望江县| 冷水江市| 蕲春县| 溧阳市| 临漳县| 彭水| 汝阳县| 双流县| 鄂温| 寿阳县| 调兵山市| 荥阳市| 分宜县| 乌拉特后旗| 建宁县| 嵊泗县| 偏关县| 吕梁市| 昌宁县| 神农架林区| 普兰县| 阳东县| 平陆县| 略阳县| 福州市| 南汇区| 普兰县| 汝州市| 张掖市| 长沙市| 富蕴县| 兴国县| 灵武市| 德化县| 瑞金市| 巴东县| 东莞市| 阳山县| 琼海市| 资兴市|