您的位置:首页 > 运维架构

【OpenCV】通过旋转图片增加训练集

2016-08-13 23:21 239 查看
通过旋转输入图片,并保存旋转后的图片。这样做是不是可以增加一些训练集数量。。。

#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <fstream>
using   namespace   std;
using namespace cv;

//旋转图像内容不变,尺寸相应变大
IplImage* rotateImage2(IplImage* img, int degree)
{
double angle = degree  * CV_PI / 180.;
double a = sin(angle), b = cos(angle);
int width = img->width, height = img->height;
//旋转后的新图尺寸
int width_rotate = int(height * fabs(a) + width * fabs(b));
int height_rotate = int(width * fabs(a) + height * fabs(b));
IplImage* img_rotate = cvCreateImage(cvSize(width_rotate, height_rotate), img->depth, img->nChannels);
cvZero(img_rotate);
//保证原图可以任意角度旋转的最小尺寸
int tempLength = sqrt((double)width * width + (double)height *height) + 10;
int tempX = (tempLength + 1) / 2 - width / 2;
int tempY = (tempLength + 1) / 2 - height / 2;
IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), img->depth, img->nChannels);
cvZero(temp);
//将原图复制到临时图像tmp中心
cvSetImageROI(temp, cvRect(tempX, tempY, width, height));
cvCopy(img, temp, NULL);
cvResetImageROI(temp);
//旋转数组map
// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
// [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
float m[6];
int w = temp->width;
int h = temp->height;
m[0] = b;
m[1] = a;
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, img_rotate, &M);
cvReleaseImage(&temp);
return img_rotate;
}

int main(){

char filename[100] ="";
IplImage *result;
IplImage *image = cvLoadImage("D:/1.png");

for (int i = 0;i < 360; i+=50)
{
char dir[100] = "D:/";
sprintf(filename, "%d.jpg", i);
strcat(dir, filename);
result = rotateImage2(image, i);
cvSaveImage(dir, result);
}

cvWaitKey(0);
return 0;
}


效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图片 opencv