<sub id="gqw76"><listing id="gqw76"></listing></sub>
      <sub id="gqw76"><listing id="gqw76"></listing></sub>

    1. <form id="gqw76"><legend id="gqw76"></legend></form>
    2. OpenCV 查找輪廓

      本文將結合實例代碼,介紹 OpenCV 如何查找輪廓、獲取邊界框。

      OpenCV 提供了 findContours 函數查找輪廓,需要以二值化圖像作為輸入、并指定些選項調用即可。

      我們以下圖作為示例:

      二值化圖像

      代碼工程 data/ 提供了小狗和紅球的二值化掩膜圖像:

      其使用預訓練好的實例分割模型來生成的,腳本可見 detectron2_seg_threshold.py。模型檢出結果,如下:

      模型用的 Mask R-CNN 已有預測邊框。但其他模型會有只出預測掩膜的,此時想要邊框就可以使用 OpenCV 來提取。

      本文代碼也提供了根據色域來獲取紅球掩膜的辦法:

      import cv2 as cv
      import numpy as np
      
      # 讀取圖像
      img = cv.imread(args.image, cv.IMREAD_COLOR)
      
      # HSV 閾值,獲取掩膜
      def _threshold_hsv(image, lower, upper):
        hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
        mask = cv.inRange(hsv, lower, upper)
        result = cv.bitwise_and(image, image, mask=mask)
        return result, mask
      
      _, thres = _threshold_hsv(img, np.array([0,110,190]), np.array([7,255,255]))
      
      # 清除小點(可選)
      kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3), (1, 1))
      thres = cv.morphologyEx(thres, cv.MORPH_OPEN, kernel)
      

      查找輪廓

      # 查找輪廓
      #  cv.RETR_EXTERNAL: 只查找外部輪廓
      contours, hierarchy = cv.findContours(
        threshold, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
      
      # 近似輪廓,減點(可選)
      contours_poly = [cv.approxPolyDP(c, 3, True) for c in contours]
      
      # 繪制輪廓
      h, w = threshold.shape[:2]
      drawing = np.zeros((h, w, 3), dtype=np.uint8)
      for i in range(len(contours)):
        cv.drawContours(drawing, contours_poly, i, (0, 255, 0), 1, cv.LINE_8, hierarchy)
      

      獲取邊界框

      boundingRect 獲取邊界框,并繪制:

      for contour in contours_poly:
        rect = cv.boundingRect(contour)
        cv.rectangle(drawing,
                      (int(rect[0]), int(rect[1])),
                      (int(rect[0]+rect[2]), int(rect[1]+rect[3])),
                      (0, 255, 0), 2, cv.LINE_8)
      

      minEnclosingCircle 獲取邊界圈,并繪制:

      for contour in contours_poly:
        center, radius = cv.minEnclosingCircle(contour)
        cv.circle(drawing, (int(center[0]), int(center[1])), int(radius),
                  (0, 255, 0), 2, cv.LINE_8)
      

      參考

      GoCoding 個人實踐的經驗分享,可關注公眾號!

      posted @ 2021-06-07 23:26  GoCodingInMyWay  閱讀(255)  評論(0編輯  收藏  舉報
      最新chease0ldman老人|无码亚洲人妻下载|大香蕉在线看好吊妞视频这里有精品www|亚洲色情综合网

        <sub id="gqw76"><listing id="gqw76"></listing></sub>
        <sub id="gqw76"><listing id="gqw76"></listing></sub>

      1. <form id="gqw76"><legend id="gqw76"></legend></form>