opencv文檔py_contours示例整理

文章目錄

    • 目錄說明
    • contours_begin
      • 目標
      • 什么是輪廓?
      • 如何畫等高線?
      • 輪廓逼近法
    • contour_features
      • 目標
      • 1.Moments 時刻
      • 2. Contour Area 輪廓面積
      • 3. Contour Perimeter 輪廓周長
      • 4. Contour Approximation 輪廓近似
      • 5. Convex Hull 凸包
      • 6. Checking Convexity 檢查凸性
      • 7. Bounding Rectangle 邊界矩形
        • 7.a. Straight Bounding Rectangle 直邊界矩形
        • 7.b. Rotated Rectangle 旋轉的矩形
      • 8. Minimum Enclosing Circle 最小外圈
      • 9. Fitting an Ellipse 擬合橢圓
      • 10. Fitting a Line 擬合直線
    • contour_properties
      • 1. Aspect Ratio 縱橫比
      • 2.Extent 范圍
      • 3.Solidity 堅固度
      • 4. Equivalent Diameter 等效直徑
      • 5. Orientation 方向
      • 6. Mask and Pixel Points 蒙版和像素點
      • 7. Maximum Value, Minimum Value and their locations 最大值,最小值和它們的位置
      • 8. Mean Color or Mean Intensity 平均顏色或平均強度
      • 9. Extreme Points 極端點
    • contours_more_functions
      • 目標
      • 理論與代碼
        • 1.凸性缺陷
        • 2.點多邊形檢驗
        • 3.匹配的形狀
    • contours_hierarchy
      • 目標
      • 理論
      • 什么是層級?
      • OpenCV中的層次表示
      • 輪廓線檢索模式
        • 1. RETR_LIST
        • 2. RETR_EXTERNAL
        • 3. RETR_CCOMP
        • 4. RETR_TREE

源碼目錄:opencv-4.6.0\doc\py_tutorials\py_imgproc\py_contours

目錄說明

  • tutorial_py_contours_begin

    Learn to find and draw Contours
    學習查找和繪制輪廓

  • tutorial_py_contour_features

    Learn to find different features of contours like area, perimeter, bounding rectangle etc.
    學習尋找不同的輪廓特征,如面積,周長,邊界矩形等。

  • tutorial_py_contour_properties

    Learn to find different properties of contours like Solidity, Mean Intensity etc.
    學習找到不同的屬性的輪廓,如固體,平均強度等。

  • tutorial_py_contours_more_functions

    Learn to find convexity defects, pointPolygonTest, match different shapes etc.
    學習查找凹凸缺陷,pointPolygonTest,匹配不同形狀等。

  • tutorial_py_contours_hierarchy

    Learn about Contour Hierarchy
    了解輪廓層次

contours_begin

目標

  • 了解輪廓是什么。
  • 學習尋找輪廓,繪制輪廓等
  • 你會看到這些函數:cv.findContours()cv.drawContours()

什么是輪廓?

輪廓可以簡單地解釋為連接所有連續點(沿著邊界)的曲線,具有相同的顏色或強度。輪廓是形狀分析和目標檢測與識別的有用工具。

  • 為了更好的精度,使用二值圖像。因此,在找到輪廓之前,應用閾值或canny邊緣檢測。
  • 自OpenCV 3.2, findContours()不再修改源圖像。
  • 在OpenCV中,尋找輪廓就像從黑色背景中尋找白色物體一樣。記住,要找到的對象應該是白色的,背景應該是黑色的。

讓我們看看如何找到二值圖像的輪廓:

import numpy as np
import cv2 as cvim = cv.imread('test.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

cv.findContours() 函數中有三個參數,第一個是源圖像,第二個是輪廓檢索方式,第三個是輪廓逼近方法。它輸出輪廓和層次結構。Contours是圖像中所有輪廓的Python列表。每個單獨的輪廓是物體邊界點的(x,y)坐標的Numpy數組。

我們將在后面詳細討論第二個和第三個參數以及層次結構。在此之前,代碼示例中給出的值將適用于所有圖像。

如何畫等高線?

使用cv.drawContours函數繪制輪廓.它也可以用來繪制任何形狀,只要你有它的邊界點。它的第一個參數是源圖像,第二個參數是應該作為Python列表傳遞的輪廓,第三個參數是輪廓的索引(在繪制單個輪廓時很有用)。要繪制所有輪廓,傳遞-1),剩下的參數是顏色,厚度等。

  • 繪制圖像中的所有輪廓:
    drawContours(img, contours, -1, (0,255,0), 3)
  • 要畫一個單獨的輪廓,如第四個輪廓:
    drawContours(img, contours, 3, (0,255,0), 3)
  • 但大多數時候,下面的方法將是有用的:
    cnt = contours[4]
    cv.drawContours(img, [cnt], 0, (0,255,0), 3)

最后兩個方法是相同的,但當你繼續,你會發現最后一個更有用。

輪廓逼近法

cv.findContours函數的第三個參數它實際上表示什么?

上面我們說過,輪廓是具有相同強度的形狀的邊界。它存儲形狀邊界的(x,y)坐標。但是它能存儲所有的坐標嗎?這是由輪廓近似法確定的。

如果你傳遞了cv.CHAIN_APPROX_NONE,存儲所有邊界點。但實際上我們需要所有的點嗎?例如,你找到了一條直線的輪廓。是否需要直線上的所有點來表示這條直線?不,我們只需要這條線的兩個端點。這就是cv.CHAIN_APPROX_SIMPLE。它去除所有冗余點并壓縮輪廓,從而節省內存。

下面的矩形圖演示了這種技術。只需在輪廓數組中的所有坐標上畫一個圓(用藍色繪制)。第一張圖片顯示了我用cv.CHAIN_APPROX_NONE得到的(734點)和第二張圖像顯示了cv.CHAIN_APPROX_SIMPLE(只有4點)。看,它節省了多少內存!

效果圖:
在這里插入圖片描述
完整代碼:


import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltim = cv.imread('black-white.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
contours_all, hierarchy_all = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
print(len(contours), len(contours[0]))
print(len(contours_all), len(contours_all[0]))
img1 = im.copy()
img2 = im.copy()
for pos in contours[0]:cv.circle(img1, pos[0], 3, (0,255,0), -1)
for pos in contours_all[0]:cv.circle(img2, pos[0], 3, (0,255,0), -1)plt.subplot(221),plt.imshow(im),plt.title('Original')
plt.subplot(222),plt.imshow(img1),plt.title('cv.CHAIN_APPROX_SIMPLE')
plt.subplot(223),plt.imshow(img2),plt.title('cv.CHAIN_APPROX_NONE')plt.show()

contour_features

目標

在本文中,我們將學習

  • 查找輪廓的不同特征,如面積,周長,質心,邊界框等
  • 你會看到很多與輪廓相關的函數。

1.Moments 時刻

圖像矩幫助你計算一些特征,如物體的質心,物體的面積等。查看維基百科頁面Image Moments

函數 cv.moments() 給出了計算出的所有矩值的字典。見下文:

import numpy as np
import cv2 as cvimg = cv.imread('star.jpg',

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

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

相關文章

B2118 驗證子串

驗證子串 題目描述 輸入兩個字符串,驗證其中一個串是否為另一個串的子串。 輸入格式 兩行,每行一個字符串。 輸出格式 若第一個串 s 1 s_1 s1? 是第二個串 s 2 s_2 s2? 的子串,則輸出(s1) is substring of (s2); 否則&…

Python并發與異步編程

Python的并發與異步編程是兩個不同的概念,但它們經常一起使用,以提高程序的性能和響應能力。以下是對這兩個概念的詳細講解: 并發編程 (Concurrency) 并發編程是指在程序中同時執行多個任務的能力。Python提供了幾種實現并發的機制&#xff…

嵌入式進階——RTC時鐘

🎬 秋野醬:《個人主頁》 🔥 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 RTC時鐘原理圖PCF8563寄存器控制與狀態寄存器 設備地址I2C環境初始化RTC寄存器數據讀取RTC寄存器數據寫入RTC鬧鐘設置RTC定時器設置…

2024.5.28晚訓題解

提前預告&#xff0c;市賽初中組會考算法題&#xff0c;應該會有兩道模板題 比如DFS BFS 二分 簡單動態規劃&#xff0c;雖然我們沒學多久&#xff0c;但是模板題你還是要會寫的 A題 編輯距離 動態規劃 注意多組輸入 #include<iostream> using namespace std; int dp[1…

9、C#【進階】特性

特性 文章目錄 1、特性概念2、自定義特性 Attribute3、特性的使用4、限制自定義特性的使用范圍5、系統自帶特性1、過時特性2、調用者信息特性3、條件編譯特性4、外部dll包函數特性 1、特性概念 特性是一種允許我們向程序的程序集添加元數據的語言結構 它是用于保存程序機構信息…

【機器學習300問】103、簡單的經典卷積神經網絡結構設計成什么樣?以LeNet-5為例說明。

一個簡單的經典CNN網絡結構由&#xff1a;輸入層、卷積層、池化層、全連接層和輸出層&#xff0c;這五種神經網絡層結構組成。它最最經典的實例是LeNet-5&#xff0c;它最早被設計用于手寫數字識別任務&#xff0c;包含兩個卷積層、兩個池化層、幾個全連接層&#xff0c;以及最…

ansible批量漏洞升級openssh版本

1、ansible宿主機準備好環境&#xff0c;并寫好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前記得提前發送秘鑰 ssh-copy-id 10.10.200.33/34/352、下載好安裝包&#xff0c;然后編寫yml [rootoxidized ansible]…

【實用的 IDEA 配置和操作技巧總結】

前置知識 IDEA的設置快捷鍵為ctrlalts鍵&#xff0c;后文介紹IDEA常見的配置就不再贅述這一點了。 基礎配置 取消默認打開上次項目 日常開發都會打開不同的項目&#xff0c;初次安裝IDEA之后&#xff0c;每次打開IDEA都會開啟上一次啟動的項目&#xff0c;所以我們需要進入設…

0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKB方案

大綱 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper測試代碼代碼 在《0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKT方案》中&#xff0c;我們介紹WTK方案的優點&#xff0c;也感受到它的繁瑣和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

element+ 引入圖標報錯 Failed to resolve import “@element-plus/icons-vue“ from “

element 引入圖標報錯 Internal server error: Failed to resolve import “element-plus/icons-vue” from “src\components\TimeLine.vue”. Does the file exist? 原因&#xff1a;element-plus需要單獨引入 icons 文檔 pnpm install element-plus/icons-vue之后就可以…

350種類型、10W+量級的API,企業應該怎么管?

忽如一夜春風來&#xff0c;萬物皆可API。 在互聯網時代&#xff0c;API無處不在&#xff1a;企業對外開放的數據、服務和業務能力&#xff0c;以API的形式提供給合作方&#xff1b;企業內部應用與應用、App與App之間的通信&#xff0c;通過API進行&#xff1b;甚至應用內部的…

php 連接sqlserver步驟

1.首先要確定使用的是sqlserver的哪個版本&#xff0c;比如sqlserver2012 2.確定服務器是64位還是32位的 3.確認一下使用php的哪個版本&#xff0c;比如php7.1 SQL Server 的 Microsoft PHP 驅動程序 Microsoft Drivers for PHP 支持矩陣 - PHP drivers for SQL Server | Mi…

Flutter 中的 CupertinoTabView 小部件:全面指南

Flutter 中的 CupertinoTabView 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CupertinoTabView 是 Cupertino 組件庫中的一個 widget&#xff0c;它用于創建 iOS 風格的標簽頁視圖。這個 widget 通常與 CupertinoTabScaffold 結合使用&#xff0c;提供了一個底部帶有…

怎么做好客戶信息管理?

根據Forrester的調查表示&#xff0c;客戶滿意度的影響可能會使某些行業的收入每年增加高達 10 億美元。而提升客戶滿意度的關鍵環節便是做好客戶信息管理。但企業在進行客戶信息管理中往往會遇到以下問題&#xff1a; 客戶信息亂&#xff1a;客戶信息存在各個 Excel表格、個人…

PMP報考條件怎么查詢?如何判定自己是否符合條件?

PMP報考條件在PMI官網上就可以查詢&#xff0c;PMP報考條件只需要符合項目管理培訓經歷和項目管理經驗兩個方面的要求即可&#xff0c;大家可以對照下方的規定判斷自己是否符合PMP報名條件 PMP報考條件 以下是PMI&#xff08;中國&#xff09;官網對于PMP報名條件的規定&…

優秀的數據分析師需要具備哪些?

在數據驅動的時代&#xff0c;數據分析師的角色越來越被重視。本文將探討優秀數據分析師必備的三大核心能力&#xff0c;并通過實際案例說明如何將這些能力轉化為業務價值&#xff0c;幫助你在職業道路上更進一步。 在數字化迅速發展的今天&#xff0c;數據分析師扮演著極其重要…

ubuntu strace命令

strace 是 Linux 系統中的一個調試工具&#xff0c;用于跟蹤并記錄系統調用&#xff08;system calls&#xff09;和信號&#xff08;signals&#xff09;。在 Ubuntu 中&#xff0c;strace 命令可以幫助開發者和系統管理員了解一個程序在運行時如何與操作系統內核進行交互&…

TypeScript常見面試題第八節

題目三十六:什么是參數解構? 一、講解視頻 TS面試題三十六:什么是參數解構? 二、題目解析 本題目考察 ts 中的解構,解構是一種特殊語法,可以將對象解構到一個或多個局部變量中,可展開操作符相反,展開是允許將一個數組展開為另一個數組,或將一個對象展開為另一個對象,…

vue+antd實踐:在輸入框光標處插入內容

今天來看一個很簡單的需求。 需求描述&#xff1a;在輸入框光標處&#xff0c;插入指定的內容。 效果如下&#xff1a; 實現思路&#xff1a;剛開始還在想怎么獲取光標的位置&#xff0c;但是發現所做的項目是基于vue3antd組件&#xff0c;那么不簡單了嘛&#xff0c;只要調…

JAVA自制小游戲之推箱子

給家里孩子實現益智游戲開發,教會他怎么使用編程。以下是一個簡單的推箱子游戲的Java實現,包含兩個關卡: 這個程序包含兩個關卡,每個關卡都是一個字符串表示的地圖。游戲會提示玩家輸入移動方向(WASD),然后根據輸入的方向移動玩家。如果玩家成功將所有的箱子推到目標位…