我嘗試閱讀檔案,但無法理解其中的區別。當目標是 3x3 正方形時,我期望得到相同的結果,但是使用 cv::boundingRect() 得到 3x3,使用 cv::minAreaRect() 得到 2x2。我正在使用 OpenCV 4.4。
這是一個示例代碼。
char data[25] = {
0, 0, 0, 0, 0,
0, 255, 255, 255, 0,
0, 255, 255, 255, 0,
0, 255, 255, 255, 0,
0, 0, 0, 0, 0
};
cv::Mat image = cv::Mat(5, 5, CV_8U, data);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::Rect boundingRect = cv::boundingRect(contours[0]);
std::cout << "[cv::boundingRect]" << std::endl;
std::cout << "w, h: " << boundingRect.size().width << " x " << boundingRect.size().height << std::endl;
cv::RotatedRect minAreaRect = cv::minAreaRect(contours[0]);
std::cout << "[cv::minAreaRect]" << std::endl;
std::cout << "w, h: " << minAreaRect.size.width << " x " << minAreaRect.size.height << std::endl;
輸出是:
[cv::boundingRect]
w, h: 3 x 3
[cv::minAreaRect]
w, h: 2 x 2
提前致謝。
uj5u.com熱心網友回復:
很簡單, boundingRect() 函式回傳一個直立的矩形,或者其底邊平行于 x 軸。minAreaRect() 函式還考慮圍繞您傳遞給它的物件輪廓的旋轉,這使其能夠找到相對于總面積的最小可能矩形。
例如
boundingRect() 為綠色,minAreaRect() 為紅色

uj5u.com熱心網友回復:
OpenCV 存在不一致和草率/沒有“定義”,尤其是在那些舊部分。
其中一些源于不愿意回傳小數值來表示一條線(輪廓)應該在像素之間。有些從不是一個長方形的“右下角”是否是最后的像素更清晰莖中,或者第一像素之外它...或者,如果我們考慮點是對那些極端的角落像素。
在 OpenCV 中,像素的中心是一個整數坐標。這么多是肯定的。
在您的示例中,顯然是一個邊長為 3 的盒子,您希望結果反映該大小。
findContours給你嚴格是分在形狀......它給中心的邊界的像素。那些將是(1,1), (1,3), (3,3), (3,1)。這是第一個問題。
- 如果您假設它們是像素(小方塊),您可以計算出真實大小是 3 x 3。
- 如果將它們視為points,則大小必須為 2 x 2。
boundingRect似乎假設值是像素。它會告訴您正確的尺寸。左上角在左上角的像素上,而不是它的左上角......矩形的右下角不在最后一個內部像素的右下角,而是在像素的中心在它之外。
minAreaRect似乎假設值是points。這解釋了其大小為 2 x 2 的結果。
根據您需要的結果,您必須進行更正。有時這意味著從大小中添加/減去一個。有時這意味著將結果移動一半以獲得像素角上的點。
此外,OpenCV 的繪圖功能也同樣草率地定義。試著畫一條特定粗細的線,比如 1 或 2,有LINE_AA風格……這是一團糟。一個矩形可能會被繪制為使得線位于左頂部內側像素,并且在右下角的像素只是外面。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355876.html
下一篇:cv2.blur()錯誤的論點?
