【Python】OpenCV算法使用案例全解

OpenCV算法使用案例全解

前言

OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。從簡單的圖像濾波到復雜的三維重建,OpenCV涵蓋了計算機視覺領域的眾多算法。本文將詳細介紹OpenCV中常見算法的使用案例,幫助讀者更好地理解和應用這些強大的工具。

一、圖像處理基礎

(一)濾波操作

濾波是圖像處理中最基本的操作之一,用于去除噪聲、平滑圖像或突出圖像的某些特征。常見的濾波方法包括高斯濾波和中值濾波。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png')# 高斯濾波
blur = cv2.GaussianBlur(img, (5, 5), 0)# 中值濾波
median = cv2.medianBlur(img, 5)# 展示結果
cv2.imshow('Original Image', img)
cv2.imshow('Gaussian Blur', blur)
cv2.imshow('Median Blur', median)
cv2.waitKey(0)
cv2.destroyAllWindows()?

(二)邊緣檢測

邊緣檢測是圖像分析中的重要步驟,用于提取圖像中物體的輪廓。常見的邊緣檢測方法包括Canny邊緣檢測、Laplacian邊緣檢測和Sobel邊緣檢測。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# Canny邊緣檢測
edges = cv2.Canny(img, 100, 200)# Laplacian邊緣檢測
laplacian = cv2.Laplacian(img, cv2.CV_64F)# Sobel邊緣檢測
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)# 展示結果
cv2.imshow('Original Image', img)
cv2.imshow('Canny Edge Detection', edges)
cv2.imshow('Laplacian Edge Detection', laplacian)
cv2.imshow('Sobel Edge Detection', sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

(三)形態學操作

形態學操作用于處理圖像的形狀,常見的操作包括膨脹、腐蝕、開運算和閉運算。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 創建結構元素
kernel = np.ones((5, 5), np.uint8)# 膨脹操作
dilation = cv2.dilate(img, kernel, iterations=1)# 腐蝕操作
erosion = cv2.erode(img, kernel, iterations=1)# 開運算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 閉運算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 展示結果
cv2.imshow('Original Image', img)
cv2.imshow('Dilation', dilation)
cv2.imshow('Erosion', erosion)
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、特征提取與匹配

(一)SIFT特征提取

SIFT(尺度不變特征變換)是一種經典的特征提取算法,用于提取圖像中的關鍵點和描述符。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 初始化SIFT檢測器
sift = cv2.SIFT_create()# 提取關鍵點和描述符
kp, des = sift.detectAndCompute(gray, None)# 繪制關鍵點
img = cv2.drawKeypoints(gray, kp, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 展示結果
cv2.imshow('SIFT Features', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)特征點匹配

特征點匹配用于比較兩幅圖像之間的相似性,常用于圖像拼接、目標識別等任務。

案例代碼:

import cv2
import numpy as np# 讀取兩張圖像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 提取特征點和描述符
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 使用FLANN算法進行匹配
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)# 篩選好的匹配點
good = []
for m, n in matches:if m.distance < 0.7 * n.distance:good.append(m)# 繪制匹配結果
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Feature Matching', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、圖像分割與分析

(一)閾值分割

閾值分割是一種簡單而有效的圖像分割方法,通過設定一個閾值將圖像分為前景和背景。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 全局閾值分割
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 自適應閾值分割
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 展示結果
cv2.imshow('Global Thresholding', thresh1)
cv2.imshow('Adaptive Thresholding', thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)輪廓檢測

輪廓檢測用于提取圖像中物體的邊界,常用于目標識別和形狀分析。

案例代碼:

import cv2
import numpy as np# 讀取圖像
img = cv2.imread('image.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 邊緣檢測
edges = cv2.Canny(gray, 50, 150)# 查找輪廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 繪制輪廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 展示結果
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、目標檢測與識別

(一)人臉檢測

人臉檢測是計算機視覺中的經典應用,OpenCV提供了基于Haar特征的級聯分類器,用于快速檢測圖像中的人臉。

案例代碼:

import cv2# 加載人臉檢測分類器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 讀取圖像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 檢測人臉
faces = face_cascade.detectMultiScale(gray, 1.3, 5)# 繪制人臉矩形框
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 展示結果
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)車牌識別

車牌識別是一種常見的目標識別應用,結合OpenCV和Tesseract OCR可以實現車牌號碼的提取。

案例代碼:

import cv2
import pytesseract# 讀取圖像
img = cv2.imread('car.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用高斯模糊去噪
blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 使用Canny邊緣檢測
edges = cv2.Canny(blurred, 50, 150)# 查找輪廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍歷輪廓,篩選車牌區域
for contour in contours:# 獲取輪廓的邊界框x, y, w, h = cv2.boundingRect(contour)aspect_ratio = float(w) / h# 篩選寬高比接近車牌的輪廓if 2 < aspect_ratio < 5:# 提取車牌區域plate = gray[y:y+h, x:x+w]# 使用Tesseract OCR識別車牌號碼text = pytesseract.image_to_string(plate, config='--psm 7')print("Detected License Plate Text:", text.strip())# 繪制車牌區域cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.putText(img, text.strip(), (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 展示結果
cv2.imshow('License Plate Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(三)目標跟蹤

目標跟蹤是計算機視覺中的一個重要應用,用于在視頻中跟蹤移動目標。OpenCV提供了多種目標跟蹤算法,如KCF、MIL等。

案例代碼:

import cv2# 初始化目標跟蹤器
tracker = cv2.TrackerKCF_create()# 打開視頻文件
video = cv2.VideoCapture('video.mp4')# 讀取第一幀
ret, frame = video.read()
if not ret:print("Failed to read video")exit()# 選擇跟蹤目標區域
bbox = cv2.selectROI(frame, False)# 初始化跟蹤器
tracker.init(frame, bbox)while True:ret, frame = video.read()if not ret:break# 更新跟蹤器success, bbox = tracker.update(frame)if success:# 繪制跟蹤框x, y, w, h = [int(v) for v in bbox]cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)else:cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# 顯示結果cv2.imshow('Object Tracking', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo.release()
cv2.destroyAllWindows()

五、三維重建與深度學習

(一)三維重建

三維重建是通過多視角圖像恢復場景三維結構的過程。OpenCV提供了立體視覺算法,如StereoBM和StereoSGBM,用于計算深度圖。

案例代碼:

import cv2
import numpy as np# 讀取左右圖像
imgL = cv2.imread('left.jpg', cv2.IMREAD_GRAYSCALE)
imgR = cv2.imread('right.jpg', cv2.IMREAD_GRAYSCALE)# 初始化立體匹配算法
stereo = cv2.StereoSGBM_create(minDisparity=0, numDisparities=16*5, blockSize=5)# 計算深度圖
disparity = stereo.compute(imgL, imgR)# 歸一化深度圖
disparity = cv2.normalize(disparity, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 顯示深度圖
cv2.imshow('Depth Map', disparity)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)深度學習與OpenCV

OpenCV支持加載預訓練的深度學習模型,如YOLO、SSD等,用于目標檢測和分類。

案例代碼:

import cv2
import numpy as np# 加載預訓練的YOLO模型
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')# 加載類別名稱
with open('coco.names', 'r') as f:classes = f.read().rstrip('\n').split('\n')# 讀取圖像
img = cv2.imread('image.jpg')
height, width, _ = img.shape# 將圖像輸入網絡
blob = cv2.dnn.blobFromImage(img, 1/255, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
outs = net.forward(net.getUnconnectedOutLayersNames())# 解析檢測結果
for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.putText(img, f'{classes[class_id]} {int(confidence * 100)}%', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)# 顯示結果
cv2.imshow('Object Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、總結

OpenCV作為計算機視覺領域的強大工具,提供了豐富的算法和功能,涵蓋了圖像處理、特征提取、目標檢測、三維重建等多個方面。通過本文的案例,讀者可以快速上手OpenCV,并將其應用于實際項目中。無論是初學者還是有一定基礎的開發者,都能從OpenCV中找到適合自己的工具和方法。

注意事項:

? 在使用OpenCV時,請確保安裝了正確的庫版本,并根據需要安裝額外的依賴(如Tesseract OCR、YOLO模型等)。

? 本文中的代碼僅為示例,實際應用中可能需要根據具體需求進行調整和優化。

? 如果你對某個算法有更深入的需求,可以參考OpenCV官方文檔或相關開源項目。

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

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

相關文章

Redis的持久化-RDBAOF

文章目錄 一、 RDB1. 觸發機制2. 流程說明3. RDB 文件的處理4. RDB 的優缺點 二、AOF1. 使用 AOF2. 命令寫?3. 文件同步4. 重寫機制5 啟動時數據恢復 一、 RDB RDB 持久化是把當前進程數據生成快照保存到硬盤的過程&#xff0c;觸發 RDB 持久化過程分為手動觸發和自動觸發。 …

Python Cookbook-2.29 帶版本號的文件名

任務 如果你想在改寫某文件之前對其做個備份&#xff0c;可以在老文件的名字后面根據慣例加上三個數字的版本號。 解決方案 我們需要編寫一個函數來完成備份工作: def VersionFile(file_spec, vtypecopy):import os,shutilif os.path.isfile(file_spec):#檢查vtype參數if v…

CCF-CSP認證 202104-1灰度直方圖

題目描述 思路 首先輸入矩陣長度、矩陣寬度和灰度范圍&#xff0c;結果數組長度可固定&#xff0c;其中的元素要初始化為0。在輸入灰度值的時候&#xff0c;結果數組中以該灰度值為索引的元素值1&#xff0c;即可統計每個灰度值的數量。 代碼 C版&#xff1a; #include <…

水果識別系統 | BP神經網絡水果識別系統,含GUI界面(Matlab)

使用說明 代碼下載&#xff1a;BP神經網絡水果識別系統&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神經網絡水果識別系統 一、引言 1.1、研究背景及意義 在當今科技迅速發展的背景下&#xff0c;人工智能技術尤其是在圖像識別領域的應用日益廣泛。水果識別作為…

如何在網頁上顯示3D CAD PMI

在現代制造業中&#xff0c;3D CAD模型已成為產品設計和制造的核心。為了更有效地傳達設計意圖和制造信息&#xff0c;產品和制造信息&#xff08;PMI&#xff09;被嵌入到3D模型中。然而&#xff0c;如何在網頁上清晰、準確地顯示這些3D CAD PMI&#xff0c;成為了一個重要的技…

Git基本命令索引

GIT基本命令索引 創建代碼庫修改和提交代碼日志管理遠程操作操作分支 創建代碼庫 操作指令初始化倉庫git init克隆遠程倉庫git clone 修改和提交代碼 操作指令查看文件狀態git status文件暫存git add文件比較git diff文件提交git commit回滾版本git reset重命名或者移動工作…

基于Selenium的Python淘寶評論爬取教程

文章目錄 前言1. 環境準備安裝 Python&#xff1a;安裝 Selenium&#xff1a;下載瀏覽器驅動&#xff1a; 2. 實現思路3. 代碼實現4. 代碼解釋5. 注意事項 前言 以下是一個基于 Selenium 的 Python 淘寶評論爬取教程&#xff0c;需要注意的是&#xff0c;爬取網站數據應當遵守…

GenBI 可視化選誰:Python Matplotlib?HTML ?Tableau?

引言 生成式 BI(Generative BI,GenBI)通過自然語言交互和自動化內容生成,革新了數據分析和商業智能(BI)領域。用戶可以通過自然語言提問,GenBI 系統自動生成相應的 SQL 查詢、獲取數據,并以可視化圖表、表格、自然語言摘要等形式呈現分析結果。 可視化是 GenBI 的關鍵…

java后端開發day24--階段項目(一)

&#xff08;以下內容全部來自上述課程&#xff09; GUI&#xff1a;Graphical User Interface 圖形用戶接口&#xff0c;采取圖形化的方式顯示操作界面 分為兩套體系&#xff1a;AWT包&#xff08;有兼容問題&#xff09;和Swing包&#xff08;常用&#xff09; 拼圖小游戲…

vmware安裝firepower ftd和fmc

在vmware虛擬機中安裝cisco firepower下一代防火墻firepower threat defence&#xff08;ftd&#xff09;和管理中心firepower management center&#xff08;fmc&#xff09;。 由于沒有cisco官網下載賬號&#xff0c;無法下載其中鏡像。使用eveng模擬器中的ftd和fmc虛擬鏡像…

【Java進階】java設計模式之單例模式

一、單例設計模式的基本概念 在 Java 編程的廣闊天地里&#xff0c;單例設計模式宛如一顆璀璨的明星&#xff0c;是一種極為實用的創建型設計模式。它的核心使命是確保一個類在整個應用程序的生命周期內僅僅存在一個實例&#xff0c;并且為外界提供一個全局唯一的訪問點來獲取…

011 rocketmq過濾消息

文章目錄 過濾消息TAG模式過濾FilterByTagProducer.javaFilterByTagConsumer.java SQL表達式過濾FilterBySQLProducer.javaFilterBySQLConsumer.java 類過濾模式&#xff08;基于4.2.0版本&#xff09; 過濾消息 消息過濾包括基于表達式過濾與基于類模式兩種過濾模式。其中表達…

【心得】一文梳理高頻面試題 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的區別并附加記憶方法

面試時很容易遇到的一個問題—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的區別&#xff0c;其實這四個版本的發展實際上是一環扣一環的&#xff0c;是逐步完善的&#xff0c;本文希望幫助讀者梳理清楚各個版本之間的區別&#xff0c;并且給出當前各個版本的應用情況&#xff0c;…

大模型部署與調優:從基礎到高效優化全解析

大模型部署與調優&#xff1a;從基礎到高效優化全解析 1. 引言 隨著深度學習的快速發展&#xff0c;大模型&#xff08;Large Models&#xff09; 在自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;、推薦系統等領域的應用日益廣泛。然而&am…

小紅書app復制短鏈,分享鏈接轉直接可訪問鏈接

簡介&#xff1a;小紅書手機app分享的鏈接需要點擊才能獲取完成鏈接&#xff0c;本文教大家如何通過代碼的方式將xhs的短連接轉化為長鏈接。 1.正常我們分享的鏈接是這樣的&#xff1a; 44 小豬吃宵夜發布了一篇小紅書筆記&#xff0c;快來看吧&#xff01; &#x1f606; KeA…

DeepSeek 助力 Vue3 開發:打造絲滑的彈性布局(Flexbox)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

DeepSeek開源周Day5壓軸登場:3FS與Smallpond,能否終結AI數據瓶頸之爭?

2025年2月28日&#xff0c;DeepSeek開源周迎來了第五天&#xff0c;也是本次活動的收官之日。自2月24日啟動以來&#xff0c;DeepSeek團隊以每天一個開源項目的節奏&#xff0c;陸續向全球開發者展示了他們在人工智能基礎設施領域的最新成果。今天&#xff0c;他們發布了Fire-F…

SQL AnyWhere 的備份與恢復

目錄 一、備份 二、恢復 1、自動恢復 2、映像恢復 3、日志恢復-指定時間點 4、日志恢復-指定偏移 5、完整的恢復流程 6、恢復最佳實踐 三、其他操作 1、dbtran 2、SQL Shell 工具 數據庫的安裝與基本使用內容請參考博客: SAP SQLAnyWhere 17 的安裝與基本使用_sql…

入門基礎項目(SpringBoot+Vue)

文章目錄 1. css布局相關2. JS3. Vue 腳手架搭建4. ElementUI4.1 引入ElementUI4.2 首頁4.2.1 整體框架4.2.2 Aside-logo4.2.3 Aside-菜單4.2.4 Header-左側4.2.5 Header-右側4.2.6 iconfont 自定義圖標4.2.7 完整代碼 4.3 封裝前后端交互工具 axios4.3.1 安裝 axios4.3.2 /src…

unity學習61:UI布局layout

目錄 1 布局 layout 1.1 先準備測試UI,新增這樣一組 panel 和 image 1.2 新增 vertical layout 1.3 現在移動任意一個image 都會影響其他 1.3.1 對比 如果沒有這個&#xff0c;就會是覆蓋效果了 1.3.2 對比 如果沒有這個&#xff0c;就會是覆蓋效果了 1.4 總結&#xf…