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!
推薦閱讀:
- OpenCV實現輪廓外接多邊形
- 使用c++實現OpenCV繪制圖形旋轉矩形
- OpenCV 輪廓周圍繪制矩形框和圓形框的方法
- C++ OpenCV實現二維碼檢測功能
- 使用c++實現OpenCV繪制圓端矩形