[OpenCV應用][Python]利用findContours辨識螺絲還是螺母

更新於 發佈於 閱讀時間約 5 分鐘

先上成果圖,如果是螺母的話就標註 is circle來區分。

raw-image

簡單的用圖表加文字說明AOI辨識

在此文章的範例中:

影像前處理:色彩空間轉換(灰階) -> 二值化閥值處理

演算法:尋找輪廓

數值判斷:長,寬,面積,周長

raw-image

圖片來源

https://www.kuposhop.com/comm/upimage/p_191004_06183.jpg

https://www.kuposhop.com/comm/upimage/p_191004_06183.jpg


程式碼

import cv2
import numpy as np

def detect_object_properties(image_path):
# 讀取圖片
image = cv2.imread(image_path)

# 將圖片轉換為灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 進行閾值處理或其他前處理步驟(根據需要)
_, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
cv2.imwrite('./thresh.png',thresh)

# 找到輪廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 遍歷每個輪廓
for contour in contours:
# 計算輪廓的長度、寬度、面積
x, y, w, h = cv2.boundingRect(contour)
area = cv2.contourArea(contour)
if area > 50:
# 判斷是否為圓形
perimeter = cv2.arcLength(contour, True) #得到周長
if perimeter:
# 圓形的相似度​ 公式
circularity = 4 * np.pi * area / (perimeter * perimeter)
is_circle = circularity >= 0.70 # 調整此閾值根據需要

# 在原始圖像上繪製輪廓及其特徵
cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

# 在物體上標註長度、寬度、面積等信息
cv2.putText(image, f'Area: {area:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
cv2.putText(image, f'Width: {w}', (x, y - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
cv2.putText(image, f'Height: {h}', (x, y - 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
if is_circle:
cv2.putText(image, f'Is circle: {is_circle}', (x, y - 70), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)

# 顯示結果圖像
cv2.imshow('Object Detection', image)
cv2.imwrite('./out.png',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 呼叫函式進行物體辨識
image_path = './111.jpg' # 替換為你的圖片路徑
detect_object_properties(image_path)

是否判斷為圓形說明

衡量一個輪廓或形狀是否接近於圓形。

接近於圓形的形狀擁有以下特點:

  • 周長(perimeter)應該接近於2 πr,其中 r是圓的半徑。
  • 面積(area)應該接近於 πr^2(平方的意思)。

利用此特性:

理想的圓形的周長 P和面積 A之間有一定的比例關係,即 P^2 / A 應該接近於一個固定的值,這個值等於

根據以上資訊就可以反推出圓形的相似度為以下公式,越接近1,越像圓。

raw-image
# 圓形的相似度
circularity = 4 * np.pi * area / (perimeter * perimeter)



avatar-img
131會員
218內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
色差檢測在許多應用中非常重要,如印刷、織物、塗料等。色差的測量通常使用 CIEDE2000 色差公式來計算兩個顏色之間的差異。 本文將檢測以下織物圖,分析出兩者的色差 程式範例 流程: 先利用K-Means分群的方式,分割出主要顏色,在用delta_e_cie2000來檢測色差 主要安裝
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
首先我們先用小畫家,創建一個簡單的十字箭頭圖,在用高斯模糊將圖用模糊來模擬圖片糊掉的狀況。 如何檢測呢? 先假設在圖像清晰的狀況下,取邊緣的話線條應該是很明顯的吧,模糊的情況下,邊緣線條應該就會變多? 看下圖,由左看到右,在圖片清晰的狀況下,線條是相當明顯的 那有什麼方法將其量化成數字?
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
色差檢測在許多應用中非常重要,如印刷、織物、塗料等。色差的測量通常使用 CIEDE2000 色差公式來計算兩個顏色之間的差異。 本文將檢測以下織物圖,分析出兩者的色差 程式範例 流程: 先利用K-Means分群的方式,分割出主要顏色,在用delta_e_cie2000來檢測色差 主要安裝
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
首先我們先用小畫家,創建一個簡單的十字箭頭圖,在用高斯模糊將圖用模糊來模擬圖片糊掉的狀況。 如何檢測呢? 先假設在圖像清晰的狀況下,取邊緣的話線條應該是很明顯的吧,模糊的情況下,邊緣線條應該就會變多? 看下圖,由左看到右,在圖片清晰的狀況下,線條是相當明顯的 那有什麼方法將其量化成數字?
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
使用cv2.imread讀取圖片時,如果路徑有包含到中文,就會報錯。 本文將提供另外一個方式cv2.imdecode,路徑有包含到中文時仍可以正常讀取圖片。 測試範例 import cv2 img = cv2.imread('D:/CRABpy/write/圖檔/chars_01.png'
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
鑽得破銅牆鐵壁的螺絲,就能輕易鑽進質地微弱的木板......
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
鑽得破銅牆鐵壁的螺絲,就能輕易鑽進質地微弱的木板......
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
點陣圖 點陣圖是由許多方格像素組成的圖片, 因此我們常常在將圖片放大時會呈現像是馬賽克的狀況, 假設期望圖片越清晰那所需要的像素會較多個, 因此空間耗用量也相對較大。 常見的格式有: .JPG .PNG .GIF .BMP .TIFF等格式。 繪製程式碼: 向量圖 向量
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。