資源簡介
可直接適用于K210等OV2640攝像頭采集后圖像的后期處理,為了適配不同比例小屏幕編寫。
使用雙線性插值法進行圖像縮放。
可以直接在圖像中指定位置合成方框,解決TFT顯示屏上圖像和方框分開刷新的閃爍問題。
可以指定位置指定大小裁剪圖像。
可以在圖像中合成字符串或矩形填充。
適配 輸入格式為uint32_t RGB565圖像。可自行修改,注釋詳細。
補充說明:當前bug,輸入輸出圖像寬度必須為2的倍數

代碼片段和文件信息
#include?“K210_CV.h“
#include?
#include?
extern?uint8_t?const?ascii0816[];
void?Image_cropping_fun(uint32_t?*originImageuint16_t?originWidth??uint32_t?*outputImage?uint16_t?outputWidth?uint16_t?outputHeigh?uint16_t?originX?uint16_t?originY)
{
??outputWidth?/=?2;
??originWidth?/=?2;
??originX?/=?2;/////////
??for?(uint16_t?i?=?0;?i?????for?(uint16_t?j?=?0;?j?????{
??????outputImage[i?*?outputWidth?+?j]?=?originImage[(originY?+?i)?*?originWidth?+?originX?+?j];
????}
??}
}
void?Image_32RGB_2_8RGB(uint32_t*?originImage?uint16_t?originWidth?uint16_t?originHeigh?uint8_t*?R?uint8_t*?G?uint8_t*?B)
{
????//拆解出三個通道數據
????for?(int?originn?=?0;?originn?????{
????????for?(int?rgbn?=?0;?rgbn?3;?rgbn++)
????????{
????????????if(originn%2)//奇數取uint32后16位?RGB565
????????????{
????????????????if(rgbn?==?0)?R[originn]?=?((originImage[originn?/?2]?&?0xffff)?&?0xF800)?>>?11;//R?5
????????????????if(rgbn?==?1)?G[originn]?=?((originImage[originn?/?2]?&?0xffff)?&?0x07E0)?>>?5;//G?6
????????????????if(rgbn?==?2)?B[originn]?=?((originImage[originn?/?2]?&?0xffff)?&?0x001F);//B?5
????????????}else
????????????{
????????????????if(rgbn?==?0)?R[originn]?=?((originImage[originn?/?2]?>>?16)?&?0xF800)?>>?11;//R?5
????????????????if(rgbn?==?1)?G[originn]?=?((originImage[originn?/?2]?>>?16)?&?0x07E0)?>>?5;//G?6
????????????????if(rgbn?==?2)?B[originn]?=?((originImage[originn?/?2]?>>?16)?&?0x001F);//B?5
????????????}
????????}
????}
}
/*
1.首先根據縮放比例計算出縮放后的寬高和單個像素點的坐標
2.根據此縮放后的坐標反推出原圖的虛坐標P
3.在該虛坐標周圍取四個真實像素點坐標ABCD
4.將四個真實像素值通過雙線性插值法計算出該虛坐標的像素值
5.將虛坐標像素值賦值給縮放后坐標
6.分通道遍歷縮放后所有像素點
A(x0y0)-----------B(x1y0)
???????|?SC?|??SD??|
???????|----p------|小數部分
???????|?SB?|??SA??|
???????|????|??????|
D(x0y1)-----------C(x1y1)
?????????小數部分
雙線性插值公式:
Z1=(f(x1y0)-f(x0y0))/(x1-x0)*u+f(x0y0)
Z2=(f(x1y1)-f(x0y1))/(x1-x0)*u+f(x0y1)
Z=(Z2-Z1)/(y1-y0)*v+Z1
由(x1-x0)=(y1-y0)=1
故Z=v*(u*f(x1y1)+(1-u)*f(x0y1))+(1-v)*(u*f(x1y0)+(1-u)*f(x0y0))
u、v為浮點數,取值范圍[01)
注意?必須分單個像素分通道進行計算。
*/
#define?StretchFun?1
#if?StretchFun?==?0?????//該函數幀率較低且占用空間過大
void?stretchImage?(uint32_t*?originImage?uint16_t?originWidth?uint16_t?originHeigh?uint32_t*?outputImage?uint16_t?outputWidth?uint16_t?outputHeigh)
{
????uint64_t?xRatio?=?(originWidth<<8)?/?outputWidth;????????//橫向比
????uint64_t?yRatio?=?(originHeigh<<8)?/?outputHeigh;????????//縱向比
????uint8_t*?originR?=?NULL;????//定義空指針
????uint8_t*?originG?=?NULL;
????uint8_t*?originB?=?NULL;
????originR?=?malloc(originWidth?*?originHeigh);????//該變量過大,故向堆中申請動態內存空間,否則作為局部變量存儲在棧中會導致溢出
????originG?=?malloc(originWidth?*?originHeigh);
????originB?=?malloc(originWidth?*?originHeigh);
????if?(!(originR||originG||originB))?printf(“originRGB?malloc?error------“);
????uint32_t?channelsR?channelsG?channelsB;
????Image_32RGB_2_8RGB(originImage?originWidth?originHeigh?originR?originG?originB);
????//?4.對新圖像的像素點進行遍歷
????for?(int?i?=?0;?i?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????14080??2020-07-18?18:49??K210_CV.c
?????文件????????2946??2020-07-18?18:17??K210_CV.h
評論
共有 條評論