OpenCV輪廓檢測之boundingRect繪制矩形邊框

函數原型

cv::Rect boundingRect( InputArray array );

參數說明

輸入:InputArray類型的array,輸入灰度圖像或二維點集。

輸出:Rect類型的矩形信息,包括矩形尺寸和位置。

測試代碼

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
	cv::Mat src = imread("test.png",0);
	cv::Mat result = src.clone();
	cv::Mat th1;
	// 最大類間差法,也稱大津算法
	threshold(result, th1, 0, 255, THRESH_OTSU);
	// 反相
	th1 = 255 - th1;
	// 確定連通區輪廓
	std::vector<std::vector<cv::Point> > contours;  // 創建輪廓容器
	std::vector<cv::Vec4i> 	hierarchy;
	cv::findContours(th1, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
	// 遍歷輪廓顯示矩形框
	for (int i = 0; i < contours.size(); ++i)
	{
		cv::Rect rect = cv::boundingRect(cv::Mat(contours[i]));
		cv::rectangle(result, rect, Scalar(255), 1);
	}
 
	imshow("original", src);
	imshow("thresh", th1);
	imshow("result", result);
	waitKey(0);
 
	return 0;
}
 

測試效果

 

補充

這個函數得到的矩形框都是方正的,還有一個函數minAreaRect也可以得到最小包圍矩形框,那個是帶傾斜角度的。

函數原型

cv::RotatedRect minAreaRect( InputArray points );

參數說明

輸入:InputArray類型的points,輸入灰度圖像或二維點集。

輸出:RotatedRect類型的旋轉矩形信息,即矩形四角點位置。

測試代碼

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
	cv::Mat src = imread("test.png",0);
	cv::Mat result = src.clone();
	cv::Mat th1;
	// 最大類間差法,也稱大津算法
	threshold(result, th1, 0, 255, THRESH_OTSU);
	// 反相
	th1 = 255 - th1;
	// 確定連通區輪廓
	std::vector<std::vector<cv::Point> > contours;  // 創建輪廓容器
	std::vector<cv::Vec4i> 	hierarchy;
	cv::findContours(th1, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
	// 遍歷輪廓顯示矩形框
	for (int i = 0; i < contours.size(); ++i)
	{
		cv::RotatedRect rotatedrect = cv::minAreaRect(cv::Mat(contours[i]));
		// 存儲旋轉矩形的四個點
		cv::Point2f ps[4];
		rotatedrect.points(ps);
		std::vector<std::vector<cv::Point>> tmpContours;    // 創建一個InputArrayOfArrays 類型的點集
		std::vector<cv::Point> contour;
		for (int i = 0; i != 4; ++i) {
			contour.emplace_back(cv::Point2i(ps[i]));
		}
		// 插入到輪廓容器中
		tmpContours.insert(tmpContours.end(), contour);
		// 繪制輪廓,也就是繪制旋轉矩形
		drawContours(result, tmpContours, -1, Scalar(0), 1, 16);  // 填充mask
	}
 
	imshow("original", src);
	imshow("thresh", th1);
	imshow("result", result);
	waitKey(0);
 
	return 0;
}
 

測試效果:

到此這篇關於OpenCV輪廓檢測之boundingRect繪制矩形邊框的文章就介紹到這瞭,更多相關OpenCV boundingRect繪制矩形邊框內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: