如何使用 OpenCV 找到图像上每个轮廓的高度和宽度

use*_*130 5 opencv image image-processing contour computer-vision

图片链接

在上图中,如果指定整个宽度为 30'5"。如何使用 opencv 计算该图像上每个单独轮廓的高度和宽度

nat*_*ncy 10

要获取轮廓的高度和宽度,可以使用cv2.boundingRect。该函数以 的形式返回轮廓信息x,y,w,h。特定轮廓的高度为h,宽度为ww这是在图像上绘制像素的结果。

在此输入图像描述

import cv2

# Load image, convert to grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# Find contours, obtain bounding rect, and draw width
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.putText(image, str(w), (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 1)

cv2.imshow('image', image)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)


Bla*_*0ut 0

std::vector<std::vector<cv::Point2i>> vecContours;
cv::Mat mat = cv::imread("[path to image]", cv::IMREAD_GRAYSCALE);
cv::threshold(mat, mat, 200, 255, cv::THRESH_BINARY);
cv::findContours(mat, vecContours, cv::RetrievalModes::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
float inchPerPixel = 30.5f / mat.cols;
for (const std::vector<cv::Point2i>& vecContour : vecContours) {
    cv::Rect2i contourRect = cv::boundingRect(vecContour);
    printf("Contour width pixels : %d, width inches %f\n", contourRect.width, inchPerPixel*contourRect.width);
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式实现这一目标:

  1. 使用阈值方法创建二值图像
  2. 使用 findContours 方法查找图像中矩形的轮廓
  3. 使用boundingRect方法获取矩形轮廓的大小
  4. 将轮廓的 与计算出的每像素英寸系数相乘