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);
}
版权声明:本文为qq_40709711原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。