opencv(Python/c++):画矩形框(普通的与旋转的矩形框)

后续参考:
利用OpenCV提取图像中的矩形区域(PPT屏幕等):后续凸包什么的可以参考这个。
https://segmentfault.com/a/1190000013925648

我们常常需要用矩形框

效果图1:普通矩形+文字

在这里插入图片描述

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#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;

}

效果图2:旋转矩形

目前opencv中没有直接绘制旋转矩形的函数,而是通过自主绘制的。

在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <iostream>

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;
}


猜你喜欢

转载自blog.csdn.net/weixin_42755384/article/details/88561526