1. 程式人生 > >C/C++ 影象處理(16)------影象輪廓の最小外接矩形

C/C++ 影象處理(16)------影象輪廓の最小外接矩形

有時做影象處理,會遇到影象中大部分資訊是冗餘的情況,以下圖為例:
這裡寫圖片描述
假設圖中黑色部分才是我們需要研究的物件,則外圍的一堆白色是我們希望去掉的,這個時候用最小外接矩形來框住黑色部分,進而擷取該部分的資訊而忽略掉其他的資訊變得實用。
下面,就給出查詢影象輪廓中最小外接矩形的程式碼,後面有空再給出在影象中擷取外接矩形的部分成為新影象的程式碼。

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

實現結果如下:
這裡寫圖片描述