3 通过鼠标事件实现投影变换
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
#include<iostream>
using namespace std;
Mat I;
Mat pI;
Point2f IPoint, pIPoint;
int i = 0, j = 0;
Point2f src[4];
Point2f dst[4];
void mouse_I(int event, int x, int y, int flags, void* param)
{
switch (event)
{
case EVENT_LBUTTONDOWN:
IPoint = Point2f(x, y);
break;
case EVENT_LBUTTONUP:
src[i] = IPoint;
circle(I, src[i], 7, Scalar(0), 3);
i += 1;
break;
default:
break;
}
}
void mouse_pI(int event, int x, int y, int flags, void* param)
{
switch (event)
{
case EVENT_LBUTTONDOWN:
pIPoint = Point2f(x, y);
break;
case EVENT_LBUTTONUP:
dst[j] = pIPoint;
circle(pI, dst[j], 7, Scalar(0), 3);
j += 1;
break;
default:
break;
}
}
int main(int argc, char* argv[])
{
String pic_name = "C://Users//lsh//Desktop//OpenCV算法精解-测试图片//第3章//img.jpg";
I = imread(pic_name, IMREAD_GRAYSCALE);
if (!I.data)
return 0;
pI = 200 * Mat::ones(I.size(), CV_8UC1);
namedWindow("I", 1);
setMouseCallback("I", mouse_I, NULL);
namedWindow("pI", 1);
setMouseCallback("pI", mouse_pI, NULL);
imshow("I", I);
imshow("pI", pI);
while (!(i == 4 && j == 4))
{
imshow("I", I);
imshow("pI", pI);
if (waitKey(50) == 'q')
break;
}
imshow("I", I);
imshow("pI", pI);
imwrite("I.jpg", I);
imwrite("pI.jpg", pI);
setMouseCallback("I", NULL, NULL);
setMouseCallback("pI", NULL, NULL);
Mat p = getPerspectiveTransform(src, dst);
Mat result;
warpPerspective(I, result, p, pI.size());
imshow("投影后的效果", result);
imwrite("result.jpg", result);
waitKey(0);
return 0;
}
void circle(Mat & img,Point center,int radius,const Scalar & color,int thickness=1,int lineType=8,int shift=0)
- img:代表输入图像
- center:代表圆心
- radius:代表半径
- color:代表颜色
- thickness:代表粗细
- lineType:代表线的类型
- 此外还有:
– rectangle():画矩形
–ellipse():画椭圆形
–line():画线段