opencv實現輪廓繪制和選擇

前面學習了opencv中圖像的一些處理,但對于opencv我們更多的還是對圖像做出一些判斷和識別,所以下面開始學習圖像的識別。

原圖:

一 圖像輪廓的識別

import cv2
pen=cv2.imread('pen.png',0)
ret,new_pen=cv2.threshold(pen,120,255,cv2.THRESH_BINARY)
cv2.imshow('pen',new_pen)
contours, hierarchy = cv2.findContours(new_pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(hierarchy)
print(contours)
print(len(contours))
pen1=pen.copy()
Contours = cv2.cvtColor(pen1, cv2.COLOR_GRAY2BGR)
cv2.drawContours(Contours,contours,-1,(0,255,0),2)
cv2.imshow('pen1',Contours)
cv2.waitKey(0)

1 圖像二值處理

ret,new_pen=cv2.threshold(pen,120,255,cv2.THRESH_BINARY)

我們這里識別圖像的時候,轉化為了灰度圖,目的是為了后面做灰度處理,在識別輪廓之前我們要讓我們的圖像更加鮮明,所以我們做了一下二值處理

2 尋找輪廓

contours, hierarchy = cv2.findContours(new_pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

這里會返回兩個參數,這里contours就是我們的輪廓。hierarchy這個表示層級之間的一種嵌套方式,不是特別重要。

我們這里查看下contours

這個是一個一個的坐標,我們要知道輪廓就是一個一個點組成的。然后我們可以通過drawContours來繪制。

3 繪制

注意到我們繪制之前我們還進行了一次的轉換,把我們的圖像轉化為了RGB圖像(我們前面轉換成了單維度的圖像),不然的話,我們使用灰度圖的線條繪制的不明顯。

Contours = cv2.cvtColor(pen1, cv2.COLOR_GRAY2BGR)
cv2.drawContours(Contours,contours,-1,(0,255,0),2)

這個里面有5個參數,第一個參數是表示我們要繪制到的目標圖像,第二個參數是我們繪制的輪廓信息,第三個表示我們要繪制的索引(-1表示繪制全部的輪廓),第四個表示我要繪制的輪廓顏色,第五個表示要繪制的粗度。

二 根據面積進行輪廓選擇

import cv2
pen1=cv2.imread('pen.png',0)
ret,pen=cv2.threshold(pen1,120,255,cv2.THRESH_BINARY)
cv2.imshow('pen',pen)
contours, hierarchy = cv2.findContours(pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)pen1=pen.copy()
aa = cv2.cvtColor(pen1, cv2.COLOR_GRAY2BGR)
cv2.drawContours(aa,contours,-1,(0,255,0),2)
are=cv2.contourArea(contours[0])
print(are)
ls=[]
for i in contours:if cv2.contourArea(i) >10000:ls.append(i)
print(ls)
cv2.drawContours(aa,ls,-1,(0,0,255),2)
cv2.imshow('pen1',aa)
cv2.waitKey(0)
key=cv2.contourArea, reverse=True)[0]
cv2.drawContours(aa,[sorted_contours],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('pen2',aa)
cv2.waitKey(0)

1 查看輪廓面積

cv2.contourArea(contours[0])

我們可以使用這個函數來查看一個輪廓的面積

2 利用面積篩選輪廓

我們對所有輪廓進行遍歷,找出面積大于10000的面積,然后添加到ls中,再畫出來,就找到了符合我們條件的輪廓。

ls=[]
for i in contours:if cv2.contourArea(i) >10000:ls.append(i)
print(ls)
cv2.drawContours(aa,ls,-1,(0,0,255),2)
# cv2.imshow('contours',contours)
cv2.imshow('pen1',aa)
cv2.waitKey(0)

3 先對輪廓面積進行排序

我們使用sorted對所有輪廓面積進行排序,然后打印出最大的那一個。注意我們繪制的時候也要對sorted_contours加上一個中括號,不然畫出來的圖像是斷斷續續的。

sorted_contours = sorted(contours, key=cv2.contourArea, reverse=True)[0]
cv2.drawContours(aa,[sorted_contours],contourIdx=-1,color=(0,0,255),thickness=3)
cv2.imshow('pen2',aa)
cv2.waitKey(0)

三 畫出輪廓的外界圓和外接矩形

1 外接圓

import cv2
pen1=cv2.imread('pen.png',0)
ret,pen=cv2.threshold(pen1,120,255,cv2.THRESH_BINARY)
cv2.imshow('pen',pen)
contours, hierarchy = cv2.findContours(pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
pen1=pen.copy()
aa = cv2.cvtColor(pen1, cv2.COLOR_GRAY2BGR)
cv2.drawContours(aa,contours,-1,(0,255,0),2)
cnt=contours[7]
[x,y],r=cv2.minEnclosingCircle(cnt)
ab=cv2.circle(aa,(int(x),int(y)),int(r),(255,0,0),2)
cv2.imshow('pen3',ab)
cv2.waitKey(0)

這里選取了第七個輪廓也就是那個鉛筆,然后使用cv2.minEnclosingCircle(cnt)來獲取這個輪廓的外界圓的外界圓,會返回兩個值,一個是坐標的圓心,一個是半徑,然后就可以通過cv2.circle專門的畫圓工具來繪制了。

cnt=contours[7]
[x,y],r=cv2.minEnclosingCircle(cnt)
ab=cv2.circle(aa,(int(x),int(y)),int(r),(255,0,0),2)
cv2.imshow('pen3',ab)
cv2.waitKey(0)

2 外接矩形

import cv2
pen1=cv2.imread('pen.png',0)
ret,pen=cv2.threshold(pen1,120,255,cv2.THRESH_BINARY)
cv2.imshow('pen',pen)
contours, hierarchy = cv2.findContours(pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
pen1=pen.copy()
aa = cv2.cvtColor(pen1, cv2.COLOR_GRAY2BGR)
cv2.drawContours(aa,contours,-1,(0,255,0),2)
cnt=contours[7]
x,y,w,h=cv2.boundingRect(cnt)
ac=cv2.rectangle(aa,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow('pen4',ac)
cv2.waitKey(0)

還是和上面的那個一樣,選取鉛筆的筆桿輪廓,然后使用boundingRect獲取我們要畫的坐標起點了,寬和高,然后就可以畫出來了。

四 繪制近似輪廓

import cv2
pen1=cv2.imread('pen.png',0)
ret,pen=cv2.threshold(pen1,120,255,cv2.THRESH_BINARY)
cv2.imshow('pen',pen)
contours = cv2.findContours(pen,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[-2]
# cv2.imshow('contours',contours)
# cv2.waitKey(0)
es=0.01*cv2.arcLength(contours[0],True)
approx=cv2.approxPolyDP(contours[0],0.01*cv2.arcLength(contours[0],True),True)
phone_new=pen1.copy()
aa = cv2.cvtColor(phone_new, cv2.COLOR_GRAY2BGR)
image_contours=cv2.drawContours(aa,[approx],-1,(0,255,0),2)
cv2.imshow('phone_new',image_contours)
cv2.waitKey(0)

先給結果圖

我們可以看到,結果圖中我們的手機的角角的地方,本來彎的變成了菱形,是因為這里采用了

es=0.01*cv2.arcLength(contours[0],True)
approx=cv2.approxPolyDP(contours[0],0.01*cv2.arcLength(contours[0],True),True)

這個es表示一個距離,就是這個地方的d如果大于我們設置的,就會直接用這個直線來取代。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97447.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】Docker洞察:掌握docker inspect命令與Go模板技巧

👨?🎓博主簡介 🏅CSDN博客專家 ??🏅云計算領域優質創作者 ??🏅華為云開發者社區專家博主 ??🏅阿里云開發者社區專家博主 💊交流社區:運維交流社區 歡迎大家的加入&#xff01…

知料覓得-新一代AI搜索引擎

本文轉載自:知料覓得-新一代AI搜索引擎 - Hello123工具導航 ** 一、🔍 初識知料覓得:你的 AI 搜索新伙伴 知料覓得是一款融合了前沿人工智能技術的智能搜索引擎,它旨在徹底改變我們獲取信息的方式。不同于傳統搜索引擎只給你一堆…

高性能網絡轉發中的哈希表技術選型與實踐

引言 在現代網絡編程中,處理大量并發連接是一個常見而重要的挑戰。特別是在中間件、代理服務器和負載均衡器等場景中,如何高效地管理數萬個并發連接并實現數據轉發,對系統性能有著至關重要的影響。本文將圍繞一個具體的網絡轉發場景,深入探討三種不同的哈希表實現(hsearc…

【CF】Day136——Codeforces Round 1046 (Div. 2) CD (動態規劃 | 數學)

C. Against the Difference題目:思路:簡單DP不難發現我們貪心是沒法貪的,因此考慮DP我們令 dp[i] 為 前 i 個元素能構造出的最長整齊子序列的長度,不難發現一個很簡單的轉移,即直接繼承 dp[i] dp[i-1],那么…

如何評價 Kimi 開源的推理平臺 Mooncake?對行業有什么影響?

2月26日,Mooncake的論文獲得「計算機存儲頂會 FAST 2025」Best Paper,這也是國內連續第三年拿到FAST Best Paper。同時,Mooncake 團隊宣布和 vLLM 團隊已經合作制定了一個多階段路線圖。這次整合將為 vLLM 引入 P/D(Prefill/Decod…

Java中不太常見的語法-總結

簡介 讀源碼時,或者看同事寫的代碼,經常看到一些不太常見的語法,這里做一個總結 不太常見的語法 成員變量的默認值 案例: public class Person2 {private String name "張三";private Integer age;public String getNa…

Easytier異地組網與移動光貓GS220-s

Easytier異地組網與Nginx反向代理_--relay-network-whitelis easytier-CSDN博客 上一篇文章介紹了Easytier實現異地組網,基于Windows應用,本篇將探討如何將Easytier寫入光貓GS220-s中,實現更方便的家庭組網。 一、Telnet移動光貓GS220-s 1…

衛星信號和無線信號的設備廠商

以下是一些與衛星信號相關的公司:中國衛通集團股份有限公司:中國航天科技集團有限公司從事衛星運營服務業的核心專業子公司,是中國唯一擁有通信衛星資源且自主可控的衛星通信運營企業。運營管理著多顆在軌民商用通信廣播衛星,覆蓋…

HyperPlonk 的硬件友好性

1. 引言 在工業界廣泛使用的 Plonk SNARK 協議高度依賴 NTT 來完成計算。HyperPlonk 是 Plonk 的一個變種,它試圖通過用 Sumcheck 替代 NTT(以及其它改進)來提升并行性。Ingonyama團隊認為: Sumcheck 在 HyperPlonk 中所謂的并行…

Visual Studio內置環境變量有哪些

在 Visual Studio 中,內置變量(也稱為宏)可以用于在項目配置中指定特定的路徑、環境變量或其他值。這些變量可以在項目的屬性頁面中使用,也可以在代碼中使用。以下是一些常用的內置變量及其用途: 常用內置變量 $(Solut…

大模型入門學習微調實戰:基于PyTorch和Hugging Face電影評價情感分析模型微調全流程(附完整代碼)手把手教你做

深入淺出:如何訓練一個屬于你的大模型? “一個強大的大模型,究竟是如何訓練出來的?” 本文將基于行業共識,為您詳細拆解大模型的完整訓練流程,并提供一個基于開源模型和數據集的實戰代碼示例,…

零、2025 年軟件設計師考試大綱

一、考試說明 1.考試目標 通過本考試的合格人員能根據軟件開發項目管理和軟件工程的要求,按照系統總體設計規格說明書進行軟件設計,編寫程序設計規格說明書等相應的文檔,組織和指導程序員編寫、調試程序,并對軟件進行優化和集成…

uniapp npm安裝形式 全局分享和按鈕分享設置

全局分享方法新建一個shareUtil.ts方法import { storageConfig } from /config/storageConfig; export default {data() {return {miniShareOptions: {title: 標題,path: /pages/tabbar/index?inviteCode,summary: 描述,imageUrl: /userPages/static/img/invitation_h_bg.png,…

【數據結構】樹和二叉樹——樹和森林

目錄樹和二叉樹樹和森林樹的存儲結構雙親表示法孩子表示法孩子兄弟表示法森林與二叉樹的轉換樹和森林的遍歷樹的先根遍歷樹的后根遍歷樹的層次遍歷森林的先序遍歷森林的中序遍歷樹的應用求樹的深度輸出樹中所有從根到葉子的路徑的算法建樹的存儲結構的算法哈夫曼樹與哈夫曼編碼…

【小寧學習日記5 PCB】電路定理

目錄 一、先搞懂:原理圖的 “構成密碼” (1)連接線:別被 “直線” 騙了! (2)結點:紅色小圓點才是 “真?連接” (3)網絡標簽:“無形的連線” …

ans1語法的一個例子nt5inf.cat

第二部分:語法第一部分:頭部語法第一部分A:0x30 類型位0x10SEQUENCE and SEQUENCE OF10語法第一部分B:83 長度3個字節,如果為1個字節,第一部分B則沒有。語法第一部分C:長度 0x09 …

三電平逆變器SVPWM控制(無解耦功能)與諧波分析

三電平逆變器的空間矢量脈寬調制(SVPWM)控制方法,重點分析在不使用解耦控制的情況下實現5%諧波含量的技術方案。我們將使用MATLAB/Simulink進行建模和仿真分析。 一、三電平逆變器基本原理 三電平逆變器相比傳統兩電平逆變器具有以下優勢: 輸出電壓波形質…

模擬實現C++中的string類型:從底層理解字符串操作

string前言核心成員變量設計構造函數與析構函數默認構造函數從C風格字符串構造填充構造拷貝構造函數迭代器范圍構造析構函數基本操作實現迭代器支持容量管理元素訪問字符串修改操作拼接操作插入與刪除字符串查找操作運算符重載總結每文推薦前言 在C中,std::string是…

pdf轉ofd之移花接木

文章目錄1.pdf轉ofd的方法1.1 spire.pdf.free1.2 ofdrw2.移花接木3.總結1.pdf轉ofd的方法 1.1 spire.pdf.free 這個是一個半開源的類庫,免費版本的在轉換的時候會有一個10的限制,所以不推薦使用,具體教程網上都有,這里只是分享有…

用【Coze】實現文案提取+創作

在AI技術飛速發展的當下,打造專屬智能應用成為不少人的向往。今天,就帶大家走進字節跳動的扣子Coze平臺,看看如何借助它搭建智能體,還會介紹AI工作流,以及詳細的Coze搭建步驟,開啟你的AI創作之旅&#xff5…