之前实现过C实现纵横比保持的RGB图像缩放,其实计算效率是不高的。

opencv的好多实现都是自带mmx, sse加速的。所以就来研究一下如何用opencv来实现纵横比保持的图像缩放。

查看了一下opencv resize函数的详细定义:

resize函数

函数原型:

void cv::resize(
InputArray _src,
OutputArray _dst,
Size dsize,
double inv_scale_x = 0,
double inv_scale_y = 0,
int interpolation = INTER_LINEAR
)

参数说明:

  • src,输入图像,Mat类型即可;

  • dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸或者有src.size()计算出来;

  • dsize,输出图像的大小。如果它等于0,由下式计算:

     dsize = Size( round(fx*src.cols, round(fy*src.rows)));
    其中fx,fy,dsize都能不为0
    
  • fx,沿水平轴的缩放系数,默认值为0,且等于0时,由下式计算:

     inv_scale_x = (double)dsize.width/ssize.width;
    
  • fy,沿垂直轴的缩放系数,默认值为0,且等于0时,由下式计算:

     inv_scale_y = (double)dsize.height/ssize.height;
    
  • interpolation,用于指定插值方式,默认值为INTER_LINEAR(线性插值),可选插值方式如下:

取值 说明
INTER_NEAREST 最近邻插值
INTER_LINEAR 线性插值(默认值)
INTER_AREA 区域插值(利用像素区域关系的重采样插值)
INTER_CUBIC 三次样条插值(超过4×4像素领域内的双三次插值)
INTER_LANCZOS4 Lanczos插值(超过8×8像素邻域的Lanczos插值)

注意:要缩小图像,一般情况下用INTER_AREA来插值;而若要放大图像,一般情况下用INTER_CUBIC(效率不高,不推荐)或INTER_LINEAR(效率高,推荐)

但是该函数实现不了任意尺寸的纵横比保持的图像缩放。

仔细想了一下,可以先做crop操作,然后再缩放,分两步,这样就可以达到纵横比保持的图像缩放。

代码如下:

#include "opencv2/opencv.hpp"
#include "opencv2/opencv.hpp"
#include<fstream>
#include <chrono>using namespace std;
using namespace cv;int main(int, char**)
{cv::Size szSize(3840 , 2160);uchar *b_Buffer = new uchar[szSize.width * szSize.height * 2];uchar *rgb_Buffer = new uchar[szSize.width * szSize.height * 3];string binFile("input.yuv");ifstream File_VideoFile;File_VideoFile.open(binFile, ios::in | ios::binary);if (!File_VideoFile.is_open()){std::cerr << "[ERROR] cannot open the YUV Input File " << binFile << endl;std::cerr << std::endl;assert(0);}File_VideoFile.read((char*)b_Buffer, sizeof(uchar)*szSize.width*szSize.height*2);File_VideoFile.close();cv::Mat mSrc(szSize,CV_8UC2, b_Buffer);cv::Mat mSrc_BGR(szSize, CV_8UC3);auto time1 = std::chrono::steady_clock::now();cvtColor(mSrc, mSrc_BGR, COLOR_YUV2BGR_YUYV);auto time2 = std::chrono::steady_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(time2-time1).count();printf("cv time: %.2f ms.\n", (float)duration / 1000);Size dstSize(1600, 1600);Size srcSize(3840, 2160);Mat dst_img(dstSize, CV_8UC3);//crop firstdouble fx = dstSize.width / srcSize.width;double fy = dstSize.height / srcSize.height;int xmin = 0, xmax = 0;int ymin = 0, ymax = 0;if (fx > fy) {//crop yxmin = 0;xmax = srcSize.width;ymin = (srcSize.height - srcSize.width) >> 1;ymax = srcSize.height - ymin;} else {//crop xymin = 0;ymax = srcSize.height;xmin = (srcSize.width - srcSize.height) >> 1;xmax = srcSize.width - xmin;}Mat crop_img = mSrc_BGR(Range(ymin, ymax), Range(xmin, xmax));//scale secondresize(crop_img, dst_img, dstSize);imwrite( "dst.bmp", dst_img);imwrite( "rgb24.bmp", mSrc_BGR);delete[] b_Buffer;delete[] rgb_Buffer;return 0;
}

Opencv实现纵横比保持的图像缩放相关推荐

  1. opencv 学习笔记9:图像缩放与图像翻转

    图像缩放 缩放包括缩小和放大 语法格式 cv2.resize()有很多参数,其中src和dsize必备 cv2.resize(src.dsize) src原始图像路径 dsize 目标图像大小 (列, ...

  2. OpenCV resize 图像缩放

    ::返回OpenCV算子速查表 图像缩放 resize 1. 函数定义 2. 例程 1. 函数定义 OpenCV官方文档 resize resize(InputArray src,OutputArra ...

  3. 图像缩放算法及速度优化

    原文来自:博客园 小欣子 图像缩放算法及速度优化--(一)最近邻插值 图像缩放算法及速度优化--(二)双线性插值 --------------------以下为原文------------------ ...

  4. OpenCV图像缩放插值之BiCubic双三次插值

    图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中 ...

  5. OpenCV 图像缩放

    缩放是对图像的大小进行调整,即使图像放大或缩小 cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) src : ...

  6. OpenCV图像缩放函数resize()的使用

    OPenCV版本:4.4 IDE:VS2017 功能描述 简述:缩放一个图像 函数把源图像缩放大或缩放小到指定的大小,注意初始的dst的类型或大小不用考虑,而是从src,dsize,fx, 和fy获取 ...

  7. OpenCV图像缩放resize各种插值方式的比较

    OpenCV图像缩放resize各种插值方式的比较 目录 OpenCV图像缩放resize各种插值方式的比较 1. resize函数说明 2.各种插值方式的比较 2.1 INTER_NEAREST(最 ...

  8. opencv python 图像缩放/图像平移/图像旋转/仿射变换/透视变换

    Geometric Transformations of Images 1图像转换 OpenCV提供了两个转换函数cv2.warpAffine和cv2.warpPerspective,可以使用它们进行 ...

  9. OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize()

    OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize() 一.图像金字塔定义: 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是 ...

最新文章

  1. 【转】节点预测与边预测任务实践
  2. [NOIP-S 2020]游记(附考前注意事项)
  3. linux内核运行关系图,一张图看懂Linux内核运行交互关系
  4. 设计灵感|色彩叠加在海报设计中的妙用!
  5. 我的Android进阶之旅------修改Android签名证书keystore的密码、别名alias以及别名密码...
  6. 使用JS制作一个鼠标可拖的DIV(二)——限制区域移动
  7. BM3D代码matlab,BM3D的学习与Matlab实现
  8. 阿里云服务器如何登录?阿里云服务器的三种登录方法...
  9. 100%解决GitHub打不开或者打开慢
  10. css段落首行缩进,文字间距
  11. PyMOL免费下载及安装教程【Win版】
  12. java中关于json传图片的方法
  13. 全网最全编程学习网站汇总来了,还不赶快收藏
  14. 计算机科学的影响因子,影响因子最高的计算机科学期刊(前50种).doc
  15. 远程分支已经不存在的解决办法
  16. Edge的收藏夹内容导出导入转移
  17. 财务部门服务器操作系统,中型企业如何选择财务系统服务器?
  18. 【实用教程】Xshell6远程连接阿里云轻量应用服务器
  19. LocalResolver国际化语言转换
  20. 湖北公安机关出台10条措施服务民营经济发展

热门文章

  1. 做海外WiFi的生意,WeShare用万能钥匙和SDK两条腿走路
  2. [策略模式]在游戏开发中的应用
  3. 世界十大数码相机ミ数码相机品牌特点
  4. 有路由协议的服务器,IPV6路由协议主要有哪些
  5. MySQL的索引下推
  6. java PDF/Word/Excel文件内容关键字检索
  7. 学习JS代码firstChild方法引用问题记录
  8. 哪款蓝牙耳机防水比较好?四款适合运动佩戴的蓝牙耳机推荐
  9. Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
  10. (转)User-Agent的由来(原来这么有意思)