后续参考:
利用OpenCV提取图像中的矩形区域(PPT屏幕等):后续凸包什么的可以参考这个。
https://segmentfault.com/a/1190000013925648
我们常常需要用矩形框
#include
#include
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
//宏定义部分
#define Win_Name3 "矩阵+字"
//main函数
int main(int argc,char** argv)
{
Mat image3 = Mat::zeros(800, 800, CV_8UC3);//生成一个800x800的窗口
rectangle (image3, Point(100, 300), Point(700, 500), Scalar(0, 0, 255), 2, 8, 0);//黄色矩形框
putText(image3,"hit area",Point(100, 300),FONT_HERSHEY_SIMPLEX,1,Scalar(255,0,0),2);
imshow(Win_Name3, image3);
while(1)
{
int key=cvWaitKey(10);
if (key==27)
{
break;
}
}
return 0;
}
目前opencv中没有直接绘制旋转矩形的函数,而是通过自主绘制的。
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat image_source = imread("/home/liuxin/桌面/opencv/hammer.jpeg");
vector<Point> vec_pts;
Point p1(800,400), p2(1100,605), p3(902,970), p4(802,780);//随意给了4个点
vec_pts.push_back(p1);
vec_pts.push_back(p2);
vec_pts.push_back(p3);
vec_pts.push_back(p4);
//将四个点表示出来,以圆的形式
circle(image_source,p1,20,Scalar(0,255,255),5);
circle(image_source,p2,20,Scalar(0,255,255),5);
circle(image_source,p3,20,Scalar(0,255,255),5);
circle(image_source,p4,20,Scalar(0,255,255),5);
//根据外接矩形的顶点,再一个一个连线连起来,构成带角度的矩形
RotatedRect rect = minAreaRect(vec_pts);//外接矩形
Point2f vertices[4];
rect.points(vertices);//外接矩形的4个顶点
for (int i = 0; i < 4; i++)//画矩形
line(image_source , vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0),3);
imshow("rotation rect", image_source);
//将roi区域提取出来
Point2f center = rect.center;//外接矩形中心点坐标
Mat rot_mat = getRotationMatrix2D(center, rect.angle, 1.0);//求旋转矩阵
Mat rot_image;
Size dst_sz(image_source.size());
warpAffine(image_source, rot_image, rot_mat, dst_sz);//原图像旋转
Mat result1 = rot_image(Rect(center.x - (rect.size.width / 2),
center.y - (rect.size.height/2),
rect.size.width,
rect.size.height));//提取ROI
imshow("result", result1);
while(1)
{
int key=cvWaitKey(10);
if (key==27)
{
break;
}
}
return 0;
return 0;
}