https://blog.csdn.net/qq_37344125/article/details/109244692

 这篇文章是用pyhon实现的,嵌入式中一般不支持python,甚至不支持opencv接口,但是只要拿到图像数据的指针,代码基本一致。

 实现图像放大缩小

    int dst_h = 20;
    int dst_w = 224;

这是缩放后的大小

#include <iostream>
#include "opencv.hpp"
#include<vector>
using namespace cv;
int main()
{
    Mat src = imread("C:/Users/xxx/Desktop/1123.png");
    imshow("src", src);
    Mat channels[3];
    split(src, channels);
//原图指针
    Mat B = channels[0];
    Mat G = channels[1];
    Mat R = channels[2];
//原图大小
    int rows = B.rows;
    int cols = B.cols;
//目的图像大小
    int dst_h = 20;
    int dst_w = 224;
//目的图像指针
    Mat B2  = Mat::zeros(Size(dst_w, dst_h),CV_8UC1);
    Mat G2 = Mat::zeros(Size(dst_w, dst_h), CV_8UC1);
    Mat R2 = Mat::zeros(Size(dst_w, dst_h), CV_8UC1);
    std::vector<Mat> dst_channels;
    dst_channels.push_back(B2);
    dst_channels.push_back(G2);
    dst_channels.push_back(R2);


    
  //缩放倍数
    float scale_x = float(cols)/dst_w;
    float scale_y = float(rows)/dst_h;

    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = B.data + src_y_1 * cols + src_x_1;
            uchar* v2 = B.data + src_y_1 * cols + src_x_2;
            uchar* v3 = B.data + src_y_2 * cols + src_x_1;
            uchar* v4 = B.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;
            
            *(B2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }
    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = G.data + src_y_1 * cols + src_x_1;
            uchar* v2 = G.data + src_y_1 * cols + src_x_2;
            uchar* v3 = G.data + src_y_2 * cols + src_x_1;
            uchar* v4 = G.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;

            *(G2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }

    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = R.data + src_y_1 * cols + src_x_1;
            uchar* v2 = R.data + src_y_1 * cols + src_x_2;
            uchar* v3 = R.data + src_y_2 * cols + src_x_1;
            uchar* v4 = R.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;

            *(R2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }

    Mat dst;
    merge(dst_channels, dst);
    imshow("dst", dst);
    waitKey(0);

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐