python代碼實現OpenCV 輪廓近似原理

2021-12-28 啟示AI科技
什麼是輪廓近似?

Contour approximation 使用Ramer - Douglas - Peucker (RDP)算法,旨在通過減少給定閾值的頂點來簡化折線。通俗地說,我們採用一條曲線並減少其頂點數量,同時保留其大部分形狀。我將在這裡給出算法的粗略概念。給定曲線的起點和終點,算法將首先找到距離連接兩個參考點的線最大距離的頂點。讓我們將其稱為max_point。如果max_point距離小於閾值,我們會自動忽略起點和終點之間的所有頂點,使曲線成為一條直線。如果max_point超出閾值,我們將遞歸重複該算法,現在將其max_point作為參考之一,並重複檢查過程。

假如,我們要 開發一個自動導航的機器人,在機器人導航的過程中,必然會搜集大量的路徑數據,進而指導機器人的前進,但是很多時候,路徑上的拐點很多,這就加大了計算的負擔,如何能儘可能地保留原始路徑數據,又可以降低大量的計算,這就需要路徑的一些估算,這就要使用到本次的路徑輪廓近似原理。

原始路徑

輪廓近似後的圖片

cv2.approxPolyDP實現輪廓近似原理

# -*- coding: utf-8 -*-
import numpy as np
import cv2
image = cv2.imread("C:/Users/angel/Desktop/image.png")
cv2.imshow("Image", image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 200, 255,
cv2.THRESH_BINARY_INV)[1]
cv2.imshow("Thresh", thresh)
cv2.waitKey(0)

首先我們導入需要的第三方包,這裡最主要的是CV2,然後使用imread函數加載一張本地的圖片,由於我們將使用圖像中形狀的邊界,因此我們將圖像從 RGB 轉換為灰度(第6 行)。一旦採用灰度格式,就可以使用 OpenCV 的threshold函數(第7-8行)輕鬆摳圖該形狀。

原圖片以及隔離開的圖形狀

# 在閾值圖像中找到最大的輪廓
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
#不同opencv版本的不同
if len(cnts) == 2:
cnts = cnts[0]
elif len(cnts) == 3:
cnts = cnts[1]

c = max(cnts, key=cv2.contourArea)

#在輸出圖像上繪製輪廓的形狀,計算
邊界框,並顯示輪廓中的點數
output = image.copy()
cv2.drawContours(output, [c], -1, (0, 255, 0), 3)
(x, y, w, h) = cv2.boundingRect(c)
text = "original, num_pts={}".format(len(c))
cv2.putText(output, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 0), 1)
print("[INFO] {}".format(text))
cv2.imshow("Original Contour", output)
cv2.waitKey(0)

使用 OpenCV 的findContours函數,我們可以挑選出給定圖像中所有可能的輪廓,我們使用了RETR_EXTERNAL參數,它只返回可用輪廓的單一表示,使用的另一個參數是CHAIN_APPROX_SIMPLE。這將刪除單個鏈線連接中的許多頂點,這些頂點本質上是冗餘的。然後我們從輪廓數組中抓取最大的輪廓,並使用drawContours函數把外框形狀畫出來。

外框輪廓

for eps in np.linspace(0.001, 0.05, 10):
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, eps * peri, True)
output = image.copy()
cv2.drawContours(output, [approx], -1, (0, 255, 0), 3)
text = "eps={:.4f}, num_pts={}".format(eps, len(approx))
cv2.putText(output, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 0), 1)

print("[INFO] {}".format(text))
cv2.imshow("Approximated Contour", output)
cv2.waitKey(0)

我們需要一個 value eps,它將作為測量頂點的閾值,利用此閾值進行輪廓近似計算的參數

在第2行,使用 計算輪廓的周長cv2.arcLength函數。然後我們使用該cv2.approxPolyDP函數,啟動輪廓近似過程(第3行)。eps×peri乘積值充當近似精度,通過遍歷不同的eps,進行輪廓的近似計算。

通過運行代碼,我們可以看出,隨著eps值不斷增加,其輪廓頂點數不斷減少,直到頂點數量不再減少為止,這表明輪廓近似算法確實有效。

[INFO] original, num_pts=402
[INFO] eps=0.0010, num_pts=30
[INFO] eps=0.0064, num_pts=25
[INFO] eps=0.0119, num_pts=18
[INFO] eps=0.0173, num_pts=15
[INFO] eps=0.0228, num_pts=14
[INFO] eps=0.0282, num_pts=10
[INFO] eps=0.0337, num_pts=7
[INFO] eps=0.0391, num_pts=6
[INFO] eps=0.0446, num_pts=5
[INFO] eps=0.0500, num_pts=5

輪廓近似原理圖

當然,在應用中,我們需要找到合適的eps的值,以便在保證輪廓精度的情況下,降低計算的成本。

相關焦點

  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • python利用opencv實現證件照換底
    opencv今天就給大家介紹一下python利用opencv庫進行藍底換紅底或者白底照片的操作。1.強大的opencv庫說到圖像處理,不得不提opencv庫。它是一個跨平臺的計算機視覺庫,可以運行在不同作業系統上,它由一些列c函數和少量c++函數組成,並提供python,matlab等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 測試~python庫介紹(一) opencv
    從事測試工作已有4年了,期間通過python編寫了很多自動化腳本,接下來的日子和大家分享一下測試工作上常用的python庫,適合常年從事黑盒測試的同學了解一些入門級技巧
  • Python OpenCV查找圖中的四邊形/矩形
    實例來源於OpenCV自帶歷程,這裡以OpenCV4.2為例,路徑為:F:\opencv4.2_release\opencv
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。
  • 基於opencv 的圖像處理入門教程
    安裝OpenCV 的安裝還是比較簡單的,直接用 pip 命令在命令行安裝即可,輸入以下命令:pip install opencv-python驗證是否安裝成功,可以運行 python 命令,然後分別輸入以下命令:import cv2
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • Python 實現人臉檢測並不難,50 行代碼搞定!
    用iPhone的同學們應該對下面的功能比較熟悉iPhone的照片中有一個「人物」的功能,能夠將照片裡的人臉識別出來並分類,背後的原理也是人臉識別技術。這篇文章主要介紹怎樣用Python實現人臉檢測。人臉檢測是人臉識別的基礎。人臉檢測的目的是識別出照片裡的人臉並定位面部特徵點,人臉識別是在人臉檢測的基礎上進一步告訴你這個人是誰。
  • opencv教程-輪廓檢測
    1:輪廓檢測的基本流程圖像灰度化→圖像二值化或邊緣檢測→輪廓檢測2:輪廓特徵輪廓矩,面積,周長等3:輪廓近似、凸包輪廓近似:設置精度,對原輪廓進行多邊形近似。https://docs.opencv.org/4.4.0/d1/d32/tutorial_py_contour_properties.html8:判斷點與輪廓的位置關係dist = cv.pointPolygonTest
  • 畢業設計| 樹莓派3B+與opencv3+PyQt5實現人臉識別門禁系統
    接下來看看,要完成門禁系統,需要哪些材料:樹莓派3B+ 一塊USB攝像頭 一個3.5寸LCD顯示屏(帶觸控)HMDI接口的顯示器飛鼠鍵盤(看個人興趣)pythonopencv-pythonPyQt5linux命令
  • 機器視覺常用算法原理及 opencv 實現源碼
    任何簡單透鏡都會產生缺陷和像差,但根據理想簡單透鏡的成像原理和光路的可逆性,將一塊透鏡放到另一塊透鏡的焦距附近,可以提高成像質量,因此將多個透鏡沿光軸仔細排列成為組合透鏡。 不管是組合透鏡還是簡單透鏡,其投影方式不可能和理想小孔模型一樣,對所有光線的準確聚焦也是無法實現的,總會產生像差。但是對於一個設計精良的透鏡系統,這些缺陷會儘可能的做到最小。
  • 10行代碼實現python人臉識別
    而且現在各大廠商也都提供了人臉識別的API接口供我們調用,可以說幾行代碼就可以完成人臉識別。但是人臉識別的根本還是基於圖像處理。在Python中最強大的圖像處理庫就是OpenCV。OpenCV簡介OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上。
  • python opencv 人臉識別
    本機環境:python 2.7mac 系統opencv 2.4.6python版本一定要安裝 2 的才行 ,版本 3 沒有 cv2 庫識別圖片原圖識別後的圖#!/usr/bin/env python# encoding: UTF-8"""Cteate time 2017-03-31author: 天才小三斤@mail: lauixData@gmail.com@blog: http://www.fucksec.com"""import cv2
  • Python實現手勢識別
    來源:blog.csdn.net/qq_45874897網上搜到了一些關於手勢處理的實驗,我在這兒簡單的實現一下,主要運用的知識就是opencv
  • 手把手:用OpenCV親手給小扎、Musk等科技大佬們做一張「平均臉」(附Python代碼)
    完整的python代碼可在後臺回復「平均臉」獲取。讓我們先來看兩張文摘菌好奇的平均臉。成功男性科技界企業家平均臉長什麼樣?下圖是小扎,馬斯克,拉裡·佩奇,和傑夫·貝索斯的平均臉。,給大家介紹生成平均臉的關鍵技術步驟,完整的python代碼可在後臺回復「平均臉」獲取。首先,我們需要使用dlib庫在每張面部圖像上建立68個面部基準點。
  • 樹莓派3b編譯安裝完整OpenCV-3.4.1 for Python3
    具體細節請參考我在愛板論壇的另一篇帖子:樹莓派搭建基於Python3和OpenCV實現的解魔方機器人二、OpenCV-3.4.1和OpenCV_Contrib-3.4.1源文件下載這裡大家可以去官網下載,直接分享下載連結:https://github.com/opencv/opencv/archive/3.4.1.ziphttps
  • OpenCV 實戰:3 步實現圖像降噪
    本文將展示如何通過三個簡單的步驟來實現降噪
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    該映射由67個點(稱為地標點)組成,可識別以下特徵:安裝要求與往常一樣,本文將用代碼演示示例,並將逐步指導你實現一個完整的人臉特徵識別示例。但是在開始之前,你需要啟動一個新的Python項目並安裝3個不同的庫:如果像我一樣使用pipenv,可以使用以下命令安裝所有這些文件:pipenv install opencv-python, dlib如果你使用的是Mac和某些版本的Linux,則在安裝dlib時可能會遇到一些問題,如果遇到的是編譯錯誤,請檢查使用的CMake庫版本。
  • Android NDK層編譯OpenCV代碼開發詳解
    下面我們就從OpenCV4Android SDK與Android NDK開發環境搭建,OpenCV C++程序實現,編譯完成與運行各個環節介紹如何在Android NDK層面編譯OpenCV C++代碼實現JNI調用。