#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;
}
输入:
输出: