利用opencv、vs2015自带的矫正功能矫正车牌
旋转RGB图像的主要函数:选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为:
-
1.打开VS2015选择文件,然后新建项目,选择新建一个Win32控制台应用程序,并选择空项目并在源文件中添加一个名为rotate的CPP文件
-
在该rotate.cpp文件中输入一下代码
#include "cv.h" // OpenCV 文件头
#include "highgui.h"
#include "cvaux.h"
#include "cxcore.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
Mat rotateImage1(Mat img, int degree)
{
degree = -degree;
double angle = degree * CV_PI / 180.; // 弧度
double a = sin(angle), b = cos(angle);
int width = img.cols;
int height = img.rows;
int width_rotate = int(height * fabs(a) + width * fabs(b));
int height_rotate = int(width * fabs(a) + height * fabs(b));
//旋转数组map
// [ m0 m1 m2 ] ===> [ A11 A12 b1 ]
// [ m3 m4 m5 ] ===> [ A21 A22 b2 ]
float map[6];
Mat map_matrix = Mat(2, 3, CV_32F, map);
// 旋转中心
CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);
CvMat map_matrix2 = map_matrix;
cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);
map[2] += (width_rotate - width) / 2;
map[5] += (height_rotate - height) / 2;
Mat img_rotate;
//对图像做仿射变换
//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。
//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,
warpAffine(img, img_rotate, map_matrix, Size(width_rotate, height_rotate), 1, 0, 0);
return img_rotate;
}
int main(int argc, char *argv[])
{
int degree;
Mat m_SrcImg;
m_SrcImg = imread("C:\\Users\\lidabao\\Desktop\\Lena1.bmp");
namedWindow("原图像", 1);
imshow("原图像", m_SrcImg);
cout << "请输入旋转的度数:";
cin >> degree;
Mat m_ResImg = rotateImage1(m_SrcImg, degree);
namedWindow("旋转后图像", 1);
-
imshow("旋转后图像", m_ResImg);
waitKey(0);
}
image: 图像数据
iRotateAngle: 要旋转的角度
width, height:原始图像的宽度,高度
lwidth,lheight:旋转后图像的宽度,高度