OpenCV学习(7.14)

图像旋转:
两种情况:绕原点旋转;绕特定点旋转。
方法一:用访问像素的方法直接旋转。
方法二:乘矩阵。

Mat类型:
Mat是一个类,有两个部分:矩阵头和一个指向存储所有像素值的矩阵的指针。
Mat A,C;//只创建信息头
A=imread("1.jpg");
Mat B(A);//使用拷贝构造函数
C=A;//赋值运算符
不仅如此,我们还可以创建仅包含部分边界信息的信息头。
Mat D(A,Rect(10,10,100,100));//给出矩形角上的两个点
Mat E=A(Range:all(), Range(1,3));//??这种方法有问题,过不了编译。

如果确实想复制一个完整的矩阵,使用函数clone()或copyTo()
Mat F=A.clone();
Mat G;
A.copyTo(G);


因为需要图像旋转,学习了仿射变换。
仿射变换:一个向量空间进行一次线性变换并接上一个平移。
一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。
所以仿射变换能用来表示如下三种变换形式:
旋转,rotation;
平移,translation;
缩放,scale。
通常使用2*3的矩阵来表示仿射变换。
已有(x,y),则新向量为(a00x+a01y+b00,a10x+a11y+b10)。

getRotationMatrix2D函数

主要用于获得图像绕着 某一点的旋转矩阵
函数调用形式:
Mat getRotationMatrix2D(Point2f center, double angle, double scale)

参数详解:
Point2f center:表示旋转的中心点
double angle:表示旋转的角度,正值表示逆时针旋转
double scale:图像缩放因子

void warpAffine(InputArray src, OutputArray dis,
InputArray M, Size dsize, int flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar() );

第一个参数,存储输入图像的矩阵;
第二个参数,存储运算结果的矩阵;
第三个参数,2*3的变换矩阵;
第四个参数,输出图像的尺寸;
第五个参数,flags,插值方式;
第六个参数,边界像素模式;
第七个参数,恒定的边界情况下取得值,默认为0。

已经调试到没问题了。

// 图像左(右)转.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

using namespace std;
using namespace cv;

double a = 480, b = 640;//长宽

int main()
{
VideoCapture capture;
capture.open(0);


//构件旋转矩阵(2x3矩阵)
Mat rot_matl = (Mat_<double>(2, 3) << 0, 1, 0 , -1, 0, b);
Mat rot_matr = (Mat_<double>(2, 3) << 0, -1, a, 1, 0, 0);
//rot_matl.at<int,int>(0, 2) = rot_matl.at<int,int >(1, 2) = 0;

while (1)
{
Mat frame;
capture >> frame;
Mat cameral,camerar;

Size src_sz = frame.size();
Size dst_sz(src_sz.width, src_sz.height);


//指定旋转中心
Point2f center(340, 230);


//cout << rot_matl << endl;
//waitKey(0);
//根据旋转矩阵进行仿射变换
warpAffine(frame, cameral, rot_matl, dst_sz);
warpAffine(frame, camerar, rot_matr, dst_sz);

//显示旋转效果
namedWindow("image", WINDOW_AUTOSIZE); namedWindow("result", WINDOW_AUTOSIZE);
imshow("image", frame);
imshow("result", cameral);
imshow("result2", camerar);
waitKey(33);

}
return 0;
}

void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
img – 图像;pt1 – 直线起点;pt2 – 直线终点;color – 颜色;thickness – 粗细
lineType – 直线类型,可以是如下值
8 (or omitted) - 8-connected 线
4 - 4-connected 线.
CV_AA - 抗锯齿线.
shift – 分位的点坐标

第二版直升机程序快写完了。

 7月15日轮休。

猜你喜欢

转载自www.cnblogs.com/Shymuel/p/9316324.html