文档章节

OpenCV实现图像的旋转

moki_oschina
 moki_oschina
发布于 2016/04/09 00:23
字数 379
阅读 25
收藏 0
#include "cv.h"

#include "highgui.h"

#include "math.h"

// clockwise 为true则顺时针旋转,否则为逆时针旋转

IplImage* rotateImage(IplImage* src, int angle, bool clockwise)

{

 angle = abs(angle) % 180;

 if (angle > 90)

 {

  angle = 90 - (angle % 90);

 }

 IplImage* dst = NULL;

 int width =

  (double)(src->height * sin(angle * CV_PI / 180.0)) +

  (double)(src->width * cos(angle * CV_PI / 180.0 )) + 1;

 int height =

  (double)(src->height * cos(angle * CV_PI / 180.0)) +

  (double)(src->width * sin(angle * CV_PI / 180.0 )) + 1;

 int tempLength = sqrt((double)src->width * src->width + src->height * src->height) + 10;

 int tempX = (tempLength + 1) / 2 - src->width / 2;

 int tempY = (tempLength + 1) / 2 - src->height / 2;

 int flag = -1;

 dst = cvCreateImage(cvSize(width, height), src->depth, src->nChannels);

 cvZero(dst);

 IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), src->depth, src->nChannels);

 cvZero(temp);

 cvSetImageROI(temp, cvRect(tempX, tempY, src->width, src->height));

 cvCopy(src, temp, NULL);

 cvResetImageROI(temp);

 if (clockwise)

  flag = 1;

 float m[6];

 int w = temp->width;

 int h = temp->height;

 m[0] = (float) cos(flag * angle * CV_PI / 180.);

 m[1] = (float) sin(flag * angle * CV_PI / 180.);

 m[3] = -m[1];

 m[4] = m[0];

 // 将旋转中心移至图像中间

 m[2] = w * 0.5f;

 m[5] = h * 0.5f;

 //

 CvMat M = cvMat(2, 3, CV_32F, m);

 cvGetQuadrangleSubPix(temp, dst, &M);

 cvReleaseImage(&temp);

 return dst;

}

int main(int argc, char **argv)

{

 IplImage *src = 0;

 IplImage *dst = 0;

 // 旋转角度

 int angle = 90;

 src = cvLoadImage("Images\\cones\\imL.png",CV_LOAD_IMAGE_COLOR);

 cvNamedWindow("src");

 cvShowImage("src", src);

 cvWaitKey(0);

 dst = rotateImage(src, angle, false);

 cvNamedWindow("dst");

 cvShowImage("dst", dst);

 cvWaitKey(0);

 cvSaveImage("dst.jpg",dst);

 cvReleaseImage(&src);

 cvReleaseImage(&dst);

 cvDestroyAllWindows();

 return 0;

}

本文转载自:http://blog.csdn.net/augusdi/article/details/8868362

共有 人打赏支持
moki_oschina
粉丝 26
博文 202
码字总数 44864
作品 0
成都
程序员
私信 提问
(三)OpenCV中的图像处理之改变色彩空间及图像的几何变换

注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正 3.1 改变色彩空间 3.1.1 目标: 这章节,学会如何转换图像的色彩空间,如BGR与Gray之间的转...

u014403318
2018/05/28
0
0
OpenCV Mat格式存储YUV图像

YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题。 对于YUV444图像来说,就很简单。YUV的三个分量的...

爱鱼
02/19
0
0
使用 OpenCV 和 Python 对图片进行旋转

OpenCV是应用最被广泛的的开源视觉库。他允许你使用很少的代码来检测图片或视频中的人脸。 这里有一些互联网上的教程来阐述怎么在OpenCV中使用仿射变换(affine transform)旋转图片--他们并...

oschina
2014/04/06
6K
0
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/88679772 该系列文章是讲解Python OpenCV图像处理知识,前...

Eastmount
03/20
0
0
1- OpenCV+TensorFlow 入门人工智能图像处理-课程介绍

人工智能最火的两个方向,自然语言处理和计算机视觉 OpenCV的图像处理 TensorFlow的使用 供需关系理论,有需求所以才有提供 招聘网站: 图像算法两万以上 都需要的技能: OpenCV TensorFlow 人...

天涯明月笙
2018/04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

想问一下C++里queue要怎么遍历

如题,想知道怎么遍历<queue>对象的元素? 貌似不能遍历。要么全部pop push一遍,要么换个容器呗。 queue是先进后出的数据类型,只能不断读top()然后再pop()掉。故意把遍历操作隐藏掉了,...

shzwork
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
2
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
3
0
【转】go get命令使用socket代理

由于某些不可描述的原因,国内使用go get命令安装某些包的时候会超时导致失败,比如net包、sys包、tools包等。第一种解决办法就是自己从git上下载后添加链接到GOPATH中,比如: 1234...

yiduwangkai
昨天
6
0
从上往下打印出二叉树的每个节点,同层节点从左至右打印。

//第一种做法 public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList <Integer> li=new ArrayList<Integer>(); ArrayList <TreeN......

南桥北木
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部