C/C++ 影象處理(16)------影象輪廓の最小外接矩形
阿新 • • 發佈:2019-01-25
有時做影象處理,會遇到影象中大部分資訊是冗餘的情況,以下圖為例:
假設圖中黑色部分才是我們需要研究的物件,則外圍的一堆白色是我們希望去掉的,這個時候用最小外接矩形來框住黑色部分,進而擷取該部分的資訊而忽略掉其他的資訊變得實用。
下面,就給出查詢影象輪廓中最小外接矩形的程式碼,後面有空再給出在影象中擷取外接矩形的部分成為新影象的程式碼。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
void fineMinAreaRect(Mat &threshold_output)
{
vector <vector<Point>> contours;
vector<Vec4i> hierarchy;
//尋找輪廓
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
//對每個找到的輪廓建立可傾斜的邊界框
vector<RotatedRect> minRect(contours.size());
for (int i = 0; i < contours.size(); i++)
{
minRect[i] = minAreaRect(Mat(contours[i]));
}
//繪出輪廓及其可傾斜的邊界框
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(255, 255, 255);
//繪製輪廓
drawContours(drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point());
Point2f rect_points[4]; minRect[i].points(rect_points);
for (int j = 0; j < 4; j++)
line(drawing, rect_points[j], rect_points[(j + 1) % 4], color, 1, 8);
}
//結果在窗體中顯示
imshow("Contours", drawing);
}
int main()
{
Mat src;
Mat src_gray;
/// 載入源影象
src = imread("..\\..\\示例圖片\\1.bmp");
/// 轉為灰度圖並二值化
cvtColor(src, src_gray, CV_BGR2GRAY);
threshold(src_gray, src_gray, 170, 255, CV_THRESH_BINARY);
/// 最小外接矩形
fineMinAreaRect(src_gray);
///顯示結果
imshow("Source", src);
waitKey(0);
return(0);
}
實現結果如下: