日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python和OpenCV对轮廓进行排序(从左到右,自上而下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Python和OpenCV對輪廓進行排序(從左到右,自上而下)

    • 1. 效果圖
    • 2. 原理
    • 3. 源碼
    • 參考

  • 使用輪廓來構建移動文檔掃描儀。
  • 使用輪廓來檢測圖像中的條形碼。
  • 利用輪廓來找到從相機到物體或標記的距離。

這一篇博客依然與輪廓相關,將介紹如何從左到右,從右到左,從上到下以及從下到上對輪廓進行排序。

1. 效果圖

面積倒序 VS 自下而上排序 效果圖如下:

面積倒序 VS 自右向左效果圖如下:

2. 原理

  • cv2.boundingRect 計算輪廓的邊界框區域

  • python魔法進行排序

  • 根據輪廓的大小/面積對輪廓進行排序

  • 僅使用一個功能即可從左到右,從右到左,從上到下以及從下到上對輪廓區域進行排序。

3. 源碼

# USAGE
# python sorting_contours.py --image images/image_02.png --method "right-to-left"# 導入必要的類
import numpy as np
import argparse
import imutils
import cv2# 輪廓排序 默認從左到右
# --cnts 待排序的輪廓列表
# --method 排序方法 自上而下,從左到右等
def sort_contours(cnts, method="left-to-right"):# 初始化反向標志和排序索引reverse = Falsei = 0# 處理是否需要逆向排序if method == "right-to-left" or method == "bottom-to-top":reverse = True# 處理時根據邊界框的x坐標排序還是y坐標排序,如果是自上而下或者自下而上則需要根據y坐標排序而不是x坐標if method == "top-to-bottom" or method == "bottom-to-top":i = 1# 構建邊界框list 并使用python魔術lambda表達式進行排序boundingBoxes = [cv2.boundingRect(c) for c in cnts](cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))# 返回排序后的輪廓和邊界框return (cnts, boundingBoxes)# 繪制輪廓ID號
def draw_contour(image, c, i):# 計算輪廓區域的中心,并繪制?代表中心M = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])# 在圖像上繪制輪廓數cv2.putText(image, "#{}".format(i + 1), (cX - 20, cY), cv2.FONT_HERSHEY_SIMPLEX,1.0, (255, 255, 255), 2)# 返回繪制了輪廓數的圖像return image# 構建命令行參數及解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the input image")
ap.add_argument("-m", "--method", required=True, help="Sorting method")
args = vars(ap.parse_args())# 加載圖像 并初始化累積的邊緣圖像
image = cv2.imread(args["image"])
accumEdged = np.zeros(image.shape[:2], dtype="uint8")# 相應的遍歷圖像的藍色、綠色、紅色通道
for chan in cv2.split(image):# 對每個通道略微中值模糊以消除高頻噪聲,執行邊緣檢測,然后更新累積的邊緣貼圖。chan = cv2.medianBlur(chan, 11)edged = cv2.Canny(chan, 50, 200)accumEdged = cv2.bitwise_or(accumEdged, edged)# 展示累積的圖像邊緣map
cv2.imshow("Edge Map", accumEdged)# 從圖像種找到輪廓,保持最大的一個
cnts = cv2.findContours(accumEdged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)# 根據輪廓面積從大到小排序,并取前5個
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
orig = image.copy()# 遍歷未排序的輪廓,并繪制在圖像上
for (i, c) in enumerate(cnts):orig = draw_contour(orig, c, i)# 展示原始的,未排序的圖
cv2.imshow("Unsorted", orig)
cv2.waitKey(0)# 根據提供的方法對輪廓進行排序
(cnts, boundingBoxes) = sort_contours(cnts, method=args["method"])# 遍歷排序后的輪廓,并繪制在圖像上
for (i, c) in enumerate(cnts):draw_contour(image, c, i)# 展示輸出圖像
cv2.imshow("Sorted", image)
cv2.waitKey(0)

參考

  • https://www.pyimagesearch.com/2015/04/20/sorting-contours-using-python-and-opencv/

總結

以上是生活随笔為你收集整理的使用Python和OpenCV对轮廓进行排序(从左到右,自上而下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。