整理智能车中使用到的摄像头图像处理算法
整理智能车中使用到的摄像头图像处理算法
19年的智能车竞赛给我留下了很深远的影响,不管是算法思路还是解决问题的方法对我来说都受益匪浅。今天整理资料时又翻出这些代码,回忆起做车时不分日夜地在赛道上调试,回忆起尽管小车已经完整跑完赛道却依旧想着如何去优化得更快更好的自己。 现在把自己的整理分享给有用的人,希望能少走写弯路吧。 注意单片机性能有限,在执行一些算法时效率会很低。
S_CV.h
#ifndef _S_CV_H #define _S_CV_H #include "include.h" //图像大小定义 /* #define S_img_H 120 #define S_img_W 188*/ #define S_img_H 60 #define S_img_W 94 #define S_S_Custom 0xAA void S_BinaryImage(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W], uint8_t ThresholdV); void S_SE_Operation(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); void S_SE_OperationBIG(uint8_t in_IMG[120][188], uint8_t out_IMG[120][188]); /**********************************形态学处理**************************************/ //腐蚀 void S_Erode(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); //膨胀 void S_Dilate(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); //开操作 void S_Open(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); //关操作 void S_Close(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); /**********************************图像显示**************************************/ #define S_MINI 0 #define S_BIG 1 //显示小图像到TFT模块 void S_Draw_TFT_MINI(uint8_t in_IMG[S_img_H][S_img_W]); //60*94图像显示成188*120 void S_DisplayMINI_Big(uint8_t in_IMG[PixMini_H][PixMini_W]); //显示大图像到TFT模块 void S_Draw_TFT_BIG(uint8_t in_IMG[IMAGEH][IMAGEW]); //显示灰度图像60*90 可选大小 void S_Gray_DisplayMINI(uint8_t in_IMG[PixMini_H][PixMini_W], u8 size); //显示灰度图像120*188 void S_Gray_Display(uint8_t in_IMG[IMAGEH][IMAGEW]); //三线图显示 void S_DisplayRunWay(RunWay_* in_Array); //三线图显示 大图 void S_DRW_Big(RunWay_* in_Array); /**********************************其他操作**************************************/ // 图像 抽取压缩188X120 to 94X60 void S_Image_zip(uint8_t in_IMG[IMAGEH][IMAGEW], uint8_t out_IMG[S_img_H][S_img_W]); // 图像 填充放大 94X60 to 188X120 void S_Image_larger(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[IMAGEH][IMAGEW]); //三线图检测 void DetectionLine(uint8_t in_IMG[PixMini_H][PixMini_W], RunWay_ * out_Array, u8 LMP, u8 Mod); //三线图定制 void DetectionLine_Custom(uint8_t in_IMG[PixMini_H][PixMini_W], RunWay_* out_Array, u8 LMP); /*********************************求阈值***************************************/ //大津法求阈值 uint8_t S_GetOSTU(uint8_t tmImage[S_img_H][S_img_W]); //修改 uint8 S_Other_OSTU(int width, int height, uint8* Image); //均值比例求阈值 u8 S_Get_01_Value(uint8_t tmImage[S_img_H][S_img_W]); /*********************************滤波***************************************/ //加权滤波 void S_WeightedFiltering(uint8_t in_IMG[S_img_H][S_img_W], uint8_t out_IMG[S_img_H][S_img_W]); //注入填充算法(Flood Fill Algorithm) void S_FloodSeedFill(uint8_t in_IMG[S_img_H][S_img_W], u8 x, u8 y, u8 old_color, u8 new_color); //修改注入填充算法 使用for循环 非递归 不溢出 void SX_FloodSeedFill(uint8_t in_IMG[40][63], u8 x, u8 y, u8 old_color, u8 new_color); //在一幅图像中判定 横穿图像的白块 未实现 u8 S_Linear(u8 height, u8 width, uint8* in_IMG); /**********************************图像边缘检测算法**************************************/ //Robert算子 void S_Robert(uint8_t in_IMG[PixMini_H][PixMini_W], uint8_t out_IMG[PixMini_H][PixMini_W]); //S_Sobel算子 void S_Sobel(uint8_t in_IMG[PixMini_H][PixMini_W], uint8_t out_IMG[PixMini_H][PixMini_W], u8 Threshold); //sobel 定制 void S_Sobel_Custom(uint8_t in_IMG[PixMini_H][PixMini_W], uint8_t out_IMG[PixMini_H][PixMini_W], u8 Threshold); #endif
