当前位置: 首页 > 编程日记 > 正文

通过transpose和flip实现图像旋转90/180/270度

在fbc_cv库中,提供了对图像进行任意角度旋转的函数rotate,其实内部也是调用了仿射变换函数warpAffine。如果图像仅是进行90度倍数的旋转,是没有必要用warpAffine函数的。这里通过transpose和flip函数实现对图像进行顺时针90度、180度、270度的旋转。

用fbc::transpose、fbc::flip和cv::transpose、cv::flip实现的结果是完全一致的。

通过fbc_cv库实现代码如下:

#include "test_rotate90.hpp"
#include <opencv2/opencv.hpp>
#include <transpose.hpp>
#include <flip.hpp>int test_rotate90()
{cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 1);if (!matSrc.data) {std::cout << "read image fail" << std::endl;return -1;}int width = matSrc.cols;int height = matSrc.rows;fbc::Mat_<uchar, 3> mat1(height, width, matSrc.data);fbc::Mat_<uchar, 3> matTranspose(width, height);fbc::transpose(mat1, matTranspose);// clockwise rotation  90fbc::Mat_<uchar, 3> matRotate90(width, height);fbc::flip(matTranspose, matRotate90, 1);cv::Mat tmp2(width, height, CV_8UC3, matRotate90.data);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_90.jpg", tmp2);// clockwise rotation 180fbc::Mat_<uchar, 3> matRotate180(height, width);fbc::flip(mat1, matRotate180, -1);cv::Mat tmp3(height, width, CV_8UC3, matRotate180.data);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_180.jpg", tmp3);// clockwise rotation 270fbc::Mat_<uchar, 3> matRotate270(width, height);fbc::flip(matTranspose, matRotate270, 0);cv::Mat tmp4(matTranspose.rows, matTranspose.cols, CV_8UC3, matRotate270.data);cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_270.jpg", tmp4);return 0;
}

结果图像如下:

原图

顺时针旋转90度 

 顺时针旋转180度


 顺时针旋转270度


GitHub:https://github.com/fengbingchun/OpenCV_Test


相关文章:

DIY强大的虚拟化环境-技术可行性部分

【技术可行性部分】大体的cpu支不支持呀&#xff0c;实际效果使用呀&#xff0c;截图效果截图嵌套虚拟化[esxi&#xff0c;xenserver&#xff0c;Hyper-V]嵌套虚拟化&#xff1a;经过各种查资料&#xff0c;和测试验证[只测过intel的&#xff0c;amd的有类似的文章请去下面的资…

C++11中rvalue references的使用

Rvalue references are a feature of C that was added with the C11 standard. The syntax of an rvalue reference is to add && after a type.为了支持移动操作&#xff0c;C11引入了一种新的引用类型----右值引用(rvalue reference)。所谓右值引用就是必须绑定到右…

AIの幕后人:探秘“硬核英雄”的超级武器

作者 | 云计算的阿晶 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 掐指一算八年之前&#xff0c;那时正是国内互联网卯足劲头起飞的一年&#xff0c;各行各业表现都很突出&#xff0c;尤其是与人们生活密切相关的手机&#xff0c;正大踏步地从功能机向智能手机转…

PAT乙级1003

1003 我要通过&#xff01; &#xff08;20 point(s)&#xff09;“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件&#xff0c;系统就输出“答案正确”&#xff0c;否则输出“答案错误”。 得到“答案…

史上最简洁的UITableView Sections 展示包含NSDicionary 的NSArray

这个最典型的就是电话本&#xff0c;然后根据A&#xff0d;Z分组, 当然很多例子&#xff0c;不过现在发现一个很简洁易懂的&#xff1a; 1. 准备数据&#xff0c;定义一个dictionary来显示所有的内容&#xff0c;这个dictionary对应的value全是数组 也就是&#xff1a; A &…

微软麻将AI Suphx或引入“凤凰房”,与其他AI对打

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】在刚刚结束的上海2019世界人工智能大会上&#xff0c;微软宣布了其在人工智能领域的最新研究突破——由微软亚洲研究院研发的麻将 AI 系统 Suphx 在国际知名的专业麻将平台“天凤”上荣升十段&…

C++11中std::function的使用

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作&#xff0c;这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。 通过std::function对C中各种可调用实体(普通函数、Lambd…

django模板的导入

模板导入 前提:多个页面有一个相同的页面版块(多个有样式标签的集合体) 如何运用:可以将多个样式标签的集合进行封装对外提供版块的名字(接口),在有该版块的页面中直接导入即可 语法:{% include 版块页面的路径 %} 四inclusion_tag自定义标签 -- 模板导入 前提:多个页面有一个相…

[UML]UML系列——包图Package

系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系&#xff08;include、extend&#xff09; [UML]UML系列——类图Class [UML]UML系列——类图class的关联关系&#xff08;聚合、组合&#xff09; [UML]UML系列——类图class的依赖关系 [UML]UML系…

2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

A Drawing Borders 很多构造方法&#xff0c;下图可能是最简单的了 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int maxn1e610; struct Point{ int x,y; }; Point a[maxn]; int numa0; Point b[maxn]; int numb0; vector<pair<double,d…

C++11中std::bind的使用

std::bind函数是用来绑定函数调用的某些参数的。std::bind它可以预先把指定可调用实体的某些参数绑定到已有的变量&#xff0c;产生一个新的可调用实体。它绑定的参数的个数不受限制&#xff0c;绑定的具体哪些参数也不受限制&#xff0c;由用户指定。 std::bind&#xff1a;(…

在图数据上做机器学习,应该从哪个点切入?

作者 | David Mack编译 | ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】很多公司和机构都在使用图数据&#xff0c;想在图上做机器学习但不知从哪里开始做&#xff0c;希望这篇文章给大家一点启发。自从我们在伦敦互联数据中心(Connected Data Lon…

C++11中Lambda表达式的使用

Lambda表达式语法&#xff1a;[capture ] ( params ) mutable exception attribute -> return-type { body } 其中capture为定义外部变量是否可见(捕获)&#xff0c;若为空&#xff0c;则表示不捕获所有外部变量&#xff0c;即所有外部变量均不可访问&#xff0c; 表示所有…

倒计时2天 | 专属技术人的盛会,为你而来!

5G 元年&#xff0c;人工智能 60 年&#xff0c;全球AI市场正发生着巨大的变化&#xff0c;顶尖科技企业和创新力量不断地进行着技术的更迭和应用的推进&#xff0c;专属于 AI 开发者的技术盛宴——2019 AI开发者大会&#xff08;AI ProCon&#xff09;将于 2 天后&#xff08;…

了解大数据的特点、来源与数据呈现方式

作业来源&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2639 浏览2019春节各种大数据分析报告&#xff0c;例如&#xff1a; 这世间&#xff0c;再无第二个国家有能力承载如此庞大的人流量。http://www.sohu.com/a/290025769_313993春节人口迁徙大数据…

Mysql使用大全 从基础到存储过程

平常习惯了phpmyadmin等其他工具的的朋友有的根本就不会命令&#xff0c;如果让你笔试去面试我看你怎么办&#xff0c;所以&#xff0c;学习一下还是非常有用的&#xff0c;也可以知道你通过GUI工具的时候工具到底做了什么。Mysql用处很广&#xff0c;是php最佳拍档&#xff0c…

GDAL库简介以及在Windows下编译过程

GDAL(Geospatial Data Abstraction Library&#xff0c;地理空间数据抽象库)是一个在X/MIT许可协议下的开源栅格空间数据转换库。官网http://www.gdal.org/index.html&#xff0c;也可参考GitHub https://github.com/OSGeo/gdal&#xff0c;最新release版本为2.1.1. GDAL是一个…

Hexo博客NexT主题美化之评论系统

前言 更多效果展示&#xff0c;请访问我的 个人博客。 效果图&#xff1a; Valine 诞生于2017年8月7日&#xff0c;是一款基于Leancloud的快速、简洁且高效的无后端评论系统。 教程&#xff1a; 登录 Leancloud 官网&#xff0c;注册之后创建一个应用&#xff0c;选择【设置】-…

倒计时1天 | 专属技术人的盛会,为你而来!

5G 元年&#xff0c;人工智能 60 年&#xff0c;全球AI市场正发生着巨大的变化&#xff0c;顶尖科技企业和创新力量不断地进行着技术的更迭和应用的推进&#xff0c;专属于 AI 开发者的技术盛宴——2019 AI开发者大会&#xff08;AI ProCon&#xff09;将于 明天&#xff08;9 …

Selenium 2 WebDriver 多线程 并发

我用的是Selenium2&#xff0c;至于它的背景和历史就不赘述了。Selenium2也叫WebDriver。下面讲个例子&#xff0c;用WebDriverjava来写个自动化测试的程序。&#xff08;如果能用firefox去测试的话&#xff0c;我就直接用Selenium IDE录脚本了。。。&#xff09;有个前提&…

GDAL2.1.1库在Ubuntu14.04下编译时遇到的问题处理方法

不用作任何调整&#xff0c;直接在Linux下编译GDAL2.1.1源码的步骤是&#xff1a;$ ./configure $ make $ make install非常简单&#xff0c; 这样也能正常生成gdal动态库、静态库&#xff0c;如果想将生成的文件放到指定的目录&#xff0c;则需改第一条命令为&#xff1a;$ ./…

刷爆了!这项技术BAT力捧!程序员:我彻底慌了...

人工智能离我们还遥远吗&#xff1f;近日&#xff0c;海底捞斥资1.5亿打造了中国首家火锅无人餐厅&#xff1b;阿里酝酿了两年之久的全球首家无人酒店也正式开始运营&#xff0c;百度无人车彻底量产。李彦宏称&#xff0c;这是中国第一款能够量产的无人驾驶乘用车。而阿里的这家…

redux的compose源码,中文注释

用图片会更清楚一点,注释和代码会分的清楚源码解析参考请参考https://segmentfault.com/a/11...

做好职业规划:做自己的船长

要想在职场上有所斩获&#xff0c;就必须做好职业规划。对于职场中人来说&#xff0c;职业规划是职业发展中最关键的向导。职业规划因人而异&#xff0c;不同的对象有不同的需求&#xff0c;因此制定的目标与计划也不尽相同&#xff0c;但个人为自己做职业规划的方法和流程是大…

GDAL中GDALDataset::RasterIO分块读取的实现

GDALDataset类中的RasterIO函数能够对图像任意指定区域、任意波段的数据按指定数据类型、指定排列方式读入内存和写入文件中&#xff0c;因此可以实现对大影像的分块读、写运算操作。针对特大的影像图像&#xff0c;有时为了减少内存消耗&#xff0c;对图像进行分块读取很有必要…

掌握深度学习,为什么要用PyTorch、TensorFlow框架?

作者 | Martin Heller译者 | 弯月责编 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】如果你需要深度学习模型&#xff0c;那么 PyTorch 和 TensorFlow 都是不错的选择。并非每个回归或分类问题都需要通过深度学习来解决。甚至可以说&#xff0c;并…

ICANN敦促业界使用DNSSEC,应对DNS劫持攻击

HTTPS加密 可以有效帮助服务器应对DNS欺骗、DNS劫持、ARP攻击等安全威胁。DNS是什么&#xff1f;DNS如何被利用&#xff1f;HTTPS如何防止DNS欺骗&#xff1f; DNS如何工作&#xff1f; 如果您想访问www.example.com&#xff0c;您的浏览器需要找到该特定Web服务器的IP地址。它…

Lucene.net: the main concepts

2019独角兽企业重金招聘Python工程师标准>>> In the previous post you learnt how to get a copy of Lucene.net and where to go in order to look for more information. As you noticed the documentation is far from being complete and easy to read. So in …

einsum,一个函数走天下

作者 | 永远在你身后转载自知乎【导读】einsum 全称 Einstein summation convention&#xff08;爱因斯坦求和约定&#xff09;&#xff0c;又称为爱因斯坦标记法&#xff0c;是爱因斯坦 1916 年提出的一种标记约定&#xff0c;本文主要介绍了einsum 的应用。简单的说&#xff…

常用排序算法的C++实现

排序是将一组”无序”的记录序列调整为”有序”的记录序列。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;rirj&#xff0c;且ri在rj之前&#xff0…