图像旋转

关键是旋转公式的推导(我是看别人的,呵呵)。有了公式,就很容易实现了。
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "cv.h"
#include "highgui.h"

using namespace std;
using namespace cv;

IplImage * oimage, * nimage;
double rx,ry,roangle;
const double pi = 3.14;
int sx,sy;
char *data;

void onTrackerSlid(int pos)
{  
	
	rx = oimage->width * 0.5;	//旋转点位置
	ry = oimage->height * 0.5;
	roangle = pos * pi /180;	//	角度转换弧度
	for(int i = 0; i < oimage->widthStep * oimage->height; i++)	//	旋转后图片初始值
		data[i] = 0;
	for(int x = 0; x < oimage->width; x++)
		for(int y =0; y < oimage->height; y++)
		{	//新图点(x,y) 到源图(sx,sy)的映射
			sx = (int)((x - rx)*cos(roangle) - (y - ry) * sin(roangle) + rx);
			sy = (int)((x - rx)*sin(roangle) + (y - ry) * cos(roangle) + ry);

			if((sx >= 0 && sx < oimage->width) && (sy >= 0 && sy < oimage->height))
			{	//新(x,y)的像素值
				data[y * oimage->widthStep + x * oimage->nChannels + 0] = (char  )((oimage->imageData + oimage->widthStep * sy)[sx * oimage->nChannels +0]);
				data[y * oimage->widthStep + x * oimage->nChannels + 1] = (char  )((oimage->imageData + oimage->widthStep * sy)[sx * oimage->nChannels +1]);
				data[y * oimage->widthStep + x * oimage->nChannels + 2] = (char  )((oimage->imageData + oimage->widthStep * sy)[sx * oimage->nChannels +2]);
			}


		}
		cvShowImage("new",nimage);


}
int main()
{
	
	oimage = cvLoadImage("C:\\Users\\LC\\Desktop\\常用标准图\\Lena.jpg");	//读入测试图片
	printf("%d %d %d",oimage->widthStep,oimage->nChannels,oimage->depth);
	 
	nimage = cvCreateImageHeader(cvGetSize(oimage),oimage->depth,oimage->nChannels);	//开辟数据
	data = (char *)(malloc(sizeof(char)*oimage->widthStep * oimage->height));

	 if(!oimage || !nimage || !data)
	{
		printf("memery error");
		return -1;
	}


	int threshold=30;	//初始值
	nimage->imageData = data;

	cvNamedWindow("old",1);
	cvNamedWindow("new",1);
	 
	cvShowImage("old",oimage);
	
	cvCreateTrackbar("angle","new",&threshold,360,onTrackerSlid);	//创建滑块
	onTrackerSlid(threshold);
	
	cvWaitKey();
	cvDestroyWindow("old");
	cvDestroyWindow("new");
	cvReleaseImage(&oimage);
	cvReleaseImage(&nimage);

	return -1;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像数据增强是一种广泛应用于计算机视觉任务中的技术,它可以通过对原始图像进行一系列变换来增加训练数据的多样性。图片旋转是其中一种常见的数据增强方式之一。 在图像旋转过程中,可以使用旋转矩阵来对图像进行变换。旋转矩阵定义了一个旋转角度和旋转中心点,通过将每个像素点围绕中心点按照指定的角度进行旋转,从而实现图像旋转操作。 在进行图像旋转时,可以选择不同的角度来生成不同方向的旋转图像。常见的角度包括90度、180度和270度等,也可以使用任意角度进行旋转。 以下是一个使用Python和OpenCV库进行图像旋转的示例代码: ```python import cv2 def rotate_image(image, angle): # 获取图像尺寸 height, width = image.shape[:2] # 计算旋转中心点 center = (width / 2, height / 2) # 定义旋转矩阵 rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0) # 执行旋转操作 rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height)) return rotated_image # 读取图像 image = cv2.imread('image.jpg') # 旋转图像 rotated_image = rotate_image(image, 90) # 显示旋转后的图像 cv2.imshow('Rotated Image', rotated_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码中,`rotate_image` 函数用于对图像进行旋转操作。首先获取图像的尺寸,然后通过 `cv2.getRotationMatrix2D` 函数计算旋转矩阵。最后使用 `cv2.warpAffine` 函数执行旋转操作,生成旋转后的图像。 请注意,以上代码仅为示例,实际使用时可能需要根据具体需求进行调整。另外,OpenCV还提供了其他图像旋转的函数和参数选项,可以根据需要进行更灵活的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值