资源简介

可直接适用于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 < outputHeigh; i++) {
    for (uint16_t j = 0; j < outputWidth; 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 < originWidth*originHeigh; 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 < outputHeigh; 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       14080  2020-07-18 18:49  K210_CV.c
     文件        2946  2020-07-18 18:17  K210_CV.h

评论

共有 条评论