opencv minAreaRect

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <math.h>
#include <sys/time.h>

#include <opencv2/imgcodecs/legacy/constants_c.h>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>

#ifndef PI
#define PI acos(-1)
#endif

int main(int argc , char* argv[])
{
    cv::Mat imgorg;
    cv::Mat contour;
    cv::Point points[5];
    
    imgorg =  cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
    contour.create(6, 2, CV_32FC1);
    points[0].x = 500;
    points[0].y = 300;
    points[1].x = 800;
    points[1].y = 200;
    points[2].x = 700;
    points[2].y = 300;
    points[3].x = 1100;
    points[3].y = 300;
    points[4].x = 1000;
    points[4].y = 500;

    for(int i = 0; i < 6; i++)
    {
        float *ptmp = contour.ptr<float>(i); 
        if(i < 5)               
        {
            *ptmp = static_cast<float>(points[i].x);
            *(ptmp+1) = static_cast<float>(points[i].y);
        }                   
        else
        {
            *ptmp = static_cast<float>(points[0].x);
            *(ptmp+1) = static_cast<float>(points[0].y);
        }
    }

    cv::RotatedRect rotateRect = minAreaRect(contour);

    //draw polygon
    for(int i = 0; i < 5; i++)
    {
        if(i < 4)
        {
            cv::line(imgorg, points[i], 
                 points[i+1], cv::Scalar(0,255,0), 3);
        }
        else
        {
            cv::line(imgorg, points[i], 
                 points[0], cv::Scalar(0,255,0), 3);
        }
    }
    printf("%f,%f,%f,%f, angle %f\n", rotateRect.center.x, rotateRect.center.y, rotateRect.size.width, rotateRect.size.height, rotateRect.angle);

    float sita = atan(-1);
    printf("sita %f\n", sita);
    sita = acos(-0.5f);
    printf("sita %f\n", sita);
    
    std::vector<cv::Point> rotatedPoints;
    float DiagonalHalfLen = sqrt(pow(rotateRect.size.width/2, 2) + pow(rotateRect.size.height/2, 2));
    float angleX1 = PI/2  - rotateRect.angle/180*PI + atan(rotateRect.size.width*1.f/rotateRect.size.height);
    int x1 = rotateRect.center.x + DiagonalHalfLen*cos(angleX1); 
    int y1 = rotateRect.center.y - DiagonalHalfLen*sin(angleX1); 
    float angleX2 = PI/2  - rotateRect.angle/180*PI - atan(rotateRect.size.width*1.f/rotateRect.size.height);
    int x2 = ceil(rotateRect.center.x + DiagonalHalfLen*cos(angleX2)); 
    int y2 = rotateRect.center.y - DiagonalHalfLen*sin(angleX2); 
    float angleX3 = -PI/2  - rotateRect.angle/180*PI + atan(rotateRect.size.width*1.f/rotateRect.size.height);
    int x3 = ceil(rotateRect.center.x + DiagonalHalfLen*cos(angleX3)); 
    int y3 = ceil(rotateRect.center.y - DiagonalHalfLen*sin(angleX3)); 
    float angleX4 = -PI/2  - rotateRect.angle/180*PI - atan(rotateRect.size.width*1.f/rotateRect.size.height);
    int x4 = rotateRect.center.x + DiagonalHalfLen*cos(angleX4); 
    int y4 = ceil(rotateRect.center.y - DiagonalHalfLen*sin(angleX4)); 
    rotatedPoints.push_back(cv::Point{x1, y1});
    rotatedPoints.push_back(cv::Point{x2, y2});
    rotatedPoints.push_back(cv::Point{x3, y3});
    rotatedPoints.push_back(cv::Point{x4, y4});
    
    for(int i = 0; i < 4; i++)
    {
        if(i < 3)
        {
            cv::line(imgorg, rotatedPoints[i], 
                 rotatedPoints[i+1], cv::Scalar(255,255, 255), 3);
        }
        else
        {
            cv::line(imgorg, rotatedPoints[3], 
                 rotatedPoints[0], cv::Scalar(255,255, 255), 3);
        }
    }
#if 0
    //draw rect
    cv::rectangle(imgorg, 
                    cv::Point{rotateRect.center.x - rotateRect.size.width/2, rotateRect.center.y - rotateRect.size.height/2},
                    cv::Point{rotateRect.center.x + rotateRect.size.width/2, rotateRect.center.y + rotateRect.size.height/2},
                    cv::Scalar{255, 0, 0}, 2); 
#endif

    cv::imwrite("./tmp.jpg", imgorg);

    return 0;
}

 

输入:

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值