分别计算平行于坐标轴的外接矩形和面积最小的外接矩形
#include <opencv.hpp>
#include <iostream>
using namespace std;
void CornerSift(string ImageName,cv::Rect &boundingRec,cv::RotatedRect &minAreaRec)
{
cv::Mat ImageInput;
ImageInput = cv::imread(ImageName,cv::ImreadModes::IMREAD_COLOR);
if (ImageInput.empty())
{
cout << "图像文件为空!" << std::endl;
return;
}
cv::Mat ImageRGB/*角点检测彩色*/, ImageGray;
ImageInput.copyTo(ImageRGB);
cvtColor(ImageRGB, ImageGray, cv::COLOR_BGR2GRAY);
vector<cv::KeyPoint> Keypoints;
float thContrast = 0.03;//角点对比度阈值
float thEdge = 10;//特征值之比。越小角点质量越高
cv::Ptr<cv::Feature2D> f2d = cv::SIFT::create(0, 3, thContrast, thEdge, 1.6);
f2d->detect(ImageGray, Keypoints);
int num = Keypoints.size();
//打印点坐标
vector<cv::Point2f> kPxys;
for (int i = 0; i < num; i++)
{
cv::KeyPoint kP = Keypoints[i];
//cout << kP.pt.x << "\t" << kP.pt.y << endl;
kPxys.push_back(kP.pt);
}
//绘制特征点
cv::drawKeypoints(ImageRGB, Keypoints, ImageRGB, cv::Scalar(255, 255, 0), cv::DrawMatchesFlags::DEFAULT);
//基于sift特征点计算最小外接矩形
//平行坐标轴的外接矩形
boundingRec = cv::boundingRect(kPxys);
cv::rectangle(ImageRGB, boundingRec, cv::Scalar(255, 0, 0),2);
//面积最小外接矩形
minAreaRec = cv::minAreaRect(kPxys);
cv::Point2f minAreaRecOPoints[4];
minAreaRec.points(minAreaRecOPoints);
for (int i = 0; i < 4; i++)
{
cv::Point2f startPoint = minAreaRecOPoints[i];
cv::Point2f endPoint;
if (i != 3)
{
endPoint = minAreaRecOPoints[i + 1];
}
else
{
endPoint = minAreaRecOPoints[0];
}
cv::line(ImageRGB, startPoint, endPoint, cv::Scalar(0, 255, 0), 2);
}
cv::imshow("2D Features", ImageRGB);
cv::waitKey(0);
cv::destroyAllWindows();
return;
}
int main()
{
cv::Rect boundingRec;
cv::RotatedRect minAreaRec;
CornerSift("t3.jpg",boundingRec,minAreaRec);
//获取矩形相关信息
cv::Point2f center = minAreaRec.center;
cv::Size2f recSize = minAreaRec.size;
float recAngle = minAreaRec.angle;
cout << center << endl;
cout << recSize << endl;
cout << recAngle << endl;
return 0;
}
效果