計算機視覺--opencv(代碼詳細教程)(一)

在計算機視覺的廣袤領域中,OpenCV?是一座極為關鍵的里程碑。無論是在前沿的學術研究,還是在蓬勃發展的工業界,OpenCV 憑借其強大的功能與高效的性能,為開發者提供了豐富的圖像處理和計算機視覺算法,助力無數項目落地。本文將深入探討 OpenCV 的基礎知識,包括其核心概念、安裝配置、常用操作以及實際應用,希望能幫助讀者全面掌握 OpenCV,為后續的計算機視覺開發筑牢根基。

一、?OpenCV 是什么?

OpenCV,即 Open Source Computer Vision?Library,是一個基于 BSD 許可發行的跨平臺計算機視覺庫。它由英特爾公司發起并參與開發,歷經多年的持續發展與完善,已經成為計算機視覺領域的行業標準之一。OpenCV 支持 C++、Python、Java 等多種主流編程語言,極大地降低了開發者的學習門檻。同時,它擁有超過 2500 種優化算法,從基礎的圖像濾波、特征提取,到復雜的目標檢測、立體視覺和機器學習算法,幾乎涵蓋了計算機視覺的各個方面。OpenCV 的高效性和易用性,使其在學術研究、工業生產和商業產品中都得到了廣泛的應用。

二、?安裝 OpenCV

Python 環境下安裝

在 Python 環境中,使用pip工具可以輕松安裝 OpenCV。打開命令行終端,輸入以下命令:

pip install opencv - python

三、Opencv的簡單操作

1、Opencv的導入

在python中Opencv用cv2來表示

import cv2

2、圖片的讀取

這里的圖片可以是任意一張圖片,網站上隨便下載一張就行,這里就不附文件了

圖片的讀取不能有中文

# a = cv2.imread('mm.jpg')#路徑不可為中文
# cv2.imshow('tu', a)
# b = cv2.waitKey(10000000)
# print(b)  # 打印按下按鍵對應的 ASCII 碼,無按鍵則返回 -1
# cv2.destroyAllWindows()#釋放緩存
# print('圖像屬性')
# print("圖像形狀(shape):", a.shape)
# print("圖像數據類型(dtype):", a.dtype)
# print("圖像大小(size):", a.size)

3、圖片的灰度轉換

# b = cv2.imread('mm.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('xx', b)
# cv2.waitKey(0)
# cv2.destroyAllWindows()#釋放緩存
# print('灰度圖像屬性')
# print("圖像形狀(shape):", b.shape)
# print("圖像數據類型(dtype):", b.dtype)
# print("圖像大小(size):", b.size)
# # 保存灰度圖像
# cv2.imwrite('ting98_GRAY.jpg', b)

4、視頻文件讀取

這里規定了waitKey == 27就表示按下ASCLL碼值為27(ESC鍵)才能退出播放

video_capture = cv2.VideoCapture('your_name.mp4')
if not video_capture.isOpened():print('無法打開文件:')exit()
while True:ret,frame = video_capture.read()if not ret:break# frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(60) == 27:break
video_capture.release()
cv2.destroyAllWindows()#每次運行完都要釋放緩存

5、ROI提取

這個看上去高大上,但實際上就是python基礎里的切片,將圖片上的某部分提取出來

a = cv2.imread('mm.jpg')  # 重新讀圖(確保 a 有效,也可復用之前的 a ,這里為清晰重寫 )
if a is not None:# ROI 切片:行范圍 350-650 ,列范圍 250-500 (根據需求調整)b = a[350:650, 250:500]cv2.imshow('yuantu', a)   # 顯示原圖cv2.imshow('qiepian', b)  # 顯示 ROI 區域cv2.waitKey(0)            # 按任意鍵繼續cv2.destroyAllWindows()

6、RGB 顏色通道提取

a = cv2.imread(r'./img.png')
b = cv2.imread(r'./mm.png')
# 2. 提取顏色通道
a1 = a[:, :, 0]  # 藍色通道(B通道)
a2 = a[:, :, 1]  # 綠色通道(G通道)
a3 = a[:, :, 2]  # 紅色通道(R通道)
blue=np.zeros_like(b)
blue[:, :, 0] =b[:, :, 0]
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)# 4. 設置窗口顯示時間,單位為毫秒(這里設置為100秒,可以根據需要調整)
cv2.waitKey(100000)
# 5. 關閉所有窗口
cv2.destroyAllWindows()

注意:我們這里是顯示藍色通道的圖像,但是所顯示的圖片確是灰色的,那是因為只顯示藍色通道時, 實際上是將藍色通道作為亮度值,是單個通道,這會導致圖像呈現為灰色。 想要展示只包含藍色通道信息的彩色圖像,可以將圖像中的綠色通道和紅色通道設為0,即移除綠色和紅色,只保留藍色。


7、合并顏色

這個和上面的顏色通道提取差不多,就是把提取后的數據再拼接回去,可以自由組合,這里演示的是合并原圖片

# '''合并顏色通道'''
# 1. 讀取圖像
a = cv2.imread('img.png')
# 2. 提取顏色通道
a1 = a[:, :, 0]  # 藍色通道(B通道)
a2 = a[:, :, 1]  # 綠色通道(G通道)
a3 = a[:, :, 2]  # 紅色通道(R通道)
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)
# b 包含藍色通道  g 包含綠色通道  r 包含紅色通道
# 使用cv2.merge()函數將三個通道重新合并成一個圖像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) #或者使用這行代碼
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

8、圖片修改

1、圖片打碼

a = cv2.imread('img.png')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))  # 矩陣賦值必須是相同大小
cv2.imshow(winname='masaike', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

2、圖片組合

這里可以將圖片的部分組合起來

a = cv2.imread('img.png')
b = cv2.imread('mm.jpg')
b[200:350, 200:350] = a[50:200, 100:250]  # 注意:矩陣的大小必須要統一。
cv2.imshow(winname='b', mat=b)
cv2.imshow(winname='a', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

3、圖片縮放

# 圖片縮放cv2.resize
# 用于調整圖像的大小。它有以下幾個參數:
# src: 要調整大小的輸入圖像,可以是numpy數組、PIL圖像或其他類型。
# dsize: 輸出圖像的大小,可以是一個元組,例如(寬, 高), 或者使用整數標量來縮放原始圖像。如果dsize為None, 則根據scale
# fx: 沿x軸的縮放系數。
# fy: 沿y軸的縮放系數。
a = cv2.imread('mm.jpg')
a_new = cv2.resize(a, dsize=(200, 600))  # 寬、高
# a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)
# print(a.shape)  # 高、寬、通道數
cv2.imshow(winname='a', mat=a)
cv2.imshow(winname='a_new', mat=a_new)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

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

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

相關文章

物聯網通訊協議-MQTT、Modbus、OPC

引言在物聯網迅速發展的今天,設備間的通信協議扮演著至關重要的角色。它們是不同設備、系統之間實現數據交換的橋梁。本文將詳細介紹三種在物聯網領域廣泛應用的通訊協議——MQTT、Modbus和OPC,包括它們的基礎概念、特點及在C#中的實現方法。一、MQTT協議…

牛客周賽R104 小紅的矩陣不動點

D-小紅的矩陣不動點_牛客周賽 Round 104 賽時這道題卡了一段時間&#xff0c;賽時代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int ans,h; int a[505][505]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n,m;cin>…

Rust面試題及詳細答案120道(19-26)-- 所有權與借用

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Jenkins + SonarQube 從原理到實戰三:SonarQube 打通 Windows AD(LDAP)認證與踩坑記錄

前言 在前兩篇文章中&#xff0c;已經介紹了 SonarQube 的部署 以及 通過 sonar-cxx 插件實現 C/C 代碼掃描。 本篇將重點講 如何讓 SonarQube 對接 Windows AD&#xff08;LDAP&#xff09;&#xff0c;實現域賬號登錄和基于 AD 組的權限管理。 一、背景與需求分析 需求分析…

[AI React Web] 包與依賴管理 | `axios`庫 | `framer-motion`庫

第七章&#xff1a;包與依賴管理 在我們使用open-lovable的旅程中&#xff0c;已經探索了它如何管理對話狀態&#xff08;第一章&#xff1a;對話狀態管理&#xff09;、將創意轉化為可運行代碼&#xff08;第二章&#xff1a;AI代碼生成管道&#xff09;、如何在安全的虛擬環…

PanSou 一款開源網盤搜索項目,集成前后端,一鍵部署,開箱即用

PanSou 網盤搜索API PanSou是一個高性能的網盤資源搜索API服務&#xff0c;支持TG搜索和自定義插件搜索。系統設計以性能和可擴展性為核心&#xff0c;支持并發搜索、結果智能排序和網盤類型分類。 項目地址&#xff1a;https://github.com/fish2018/pansou 特性&#xff08…

java爬蟲實戰

本人目前在做魚皮的《智能協同云圖庫》&#xff0c;涉及到了以圖搜圖圖片爬取&#xff0c;雖然以前有爬過圖片&#xff0c;但是用的都是別人現成的代碼&#xff0c;不怎么去理解為什么要這樣做&#xff0c;這次有在嘗試理解每一個步驟。本人基礎極差&#xff0c;屬于一點基礎也…

深入詳解C語言的循環結構:while循環、do-while循環、for循環,結合實例,講透C語言的循環結構

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#…

北京-4年功能測試2年空窗-報培訓班學測開-第七十四天-線下面試-聊的很滿意但可能有風險-等信吧

今天沒去教室&#xff0c;因為下午有個線下面試。其實是可以去教室的&#xff0c;但我實在太焦慮了&#xff0c;我覺得去了教室我心情會更不好&#xff0c;什么都干不下去&#xff0c;所以我選擇不去早上依舊是帶著滿滿焦慮起來的&#xff0c;會覺得自己的一切都不令自己滿意&a…

在ubuntu服務器下安裝cuda和cudnn(筆記)

目錄 0 引言 1 相關環境查詢 2 安裝cuda 2.1 下載并安裝 2.2 安裝選項配置 2.3 驗證安裝 3 安裝cudnn 3.1 下載 3.2 解壓 3.3 刪除舊版本 cuDNN 3.4 復制新文件到 CUDA 目錄 3.5 設置文件權限 3.6 創建軟鏈接 3.7 驗證安裝 0 引言 我在使用服務器的cuda11.8的時…

docker安裝centos

docker庫地址https://hub.docker.com/ 嘗試使用centos7試了幾次超時 換了個版本就可以了 docker pull centos:centos7.9.2009有時候需要更新資源地址 可以使用 vim /etc/docker/daemon.json配置其他資源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

內容索引之word轉md工具 - markitdown

切分文檔構建RAG庫過程中&#xff0c;langchain、llamaindex更期望處理latex、md類帶有顯式結構文檔。 langchain、llamaindex切分word&#xff0c;有可能將段落中間截斷&#xff0c;導致切分后的塊語義不完整。 所以&#xff0c;需要先將word轉化為md格式&#xff0c;然后再…

MaxKB+合合信息TextIn:通過API實現PDF掃描件的文檔審核

上海合合信息科技股份有限公司&#xff08;以下簡稱為合合信息&#xff09;是一家深耕人工智能、OCR&#xff08;光學字符識別&#xff09;及商業大數據技術領域的科技企業。該公司擁有領先的智能文字識別技術&#xff0c;其名片全能王&#xff08;CamCard&#xff09;、掃描全…

MyBatis 核心入門:從概念到實戰,一篇掌握簡單增刪改查

目錄 一、什么是 MyBatis&#xff1f;為什么要用它&#xff1f; 二、MyBatis 核心概念&#xff08;通俗理解&#xff09; 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件&#xff08;XML&#xff09; 三、手把手搭建第一個 MyBatis 項目 1. 準備工作 2. 核心配置文…

數據結構初階(12)排序算法—插入排序(插入、希爾)(動圖演示)

2. 常見排序算法的實現2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一種簡單的插入排序法&#xff1a;基本思想把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中。直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 。 比 挪 (…

MySQL優化常用的幾個方法

本實例是對慢sql從2萬優化到5千優化方法的匯總。 首先貼上優化效果&#xff1a;1、更新數據時使用ID更新&#xff1b;2、"分頁/輪詢"查詢時先獲取符合數據要求主鍵的最大和最小ID&#xff0c;然后WHERE條件增加ID步增查詢&#xff1b;3、檢查SQL是否命中WHERE條件&am…

深入解析 AUTOSAR:汽車軟件開發的革命性架構

引言在汽車智能化、網聯化、電動化浪潮席卷全球的今天&#xff0c;汽車電子系統的復雜性與日俱增。傳統“煙囪式”的 ECU 開發模式&#xff08;各供應商獨立開發軟硬件&#xff09;帶來了巨大的兼容性、復用性和維護成本挑戰。AUTOSAR&#xff08;AUTomotive Open System ARchi…

計算機視覺(opencv)實戰一——圖像本質、數字矩陣、RGB + 圖片基本操作(灰度、裁剪、替換等)

OpenCV 入門教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺庫&#xff0c;廣泛應用于圖像處理、視頻分析、機器學習等領域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模塊。本文將帶你一步步掌握 cv2…

《探索C++ set與multiset容器:深入有序唯一性集合的實現與應用》

前引&#xff1a;在STL的關聯式容器中&#xff0c;set以其嚴格的元素唯一性和自動排序特性成為處理有序數據的核心工具。其底層基于紅黑樹&#xff08;Red-Black Tree&#xff09;實現&#xff0c;保證了O(log n)的查找、插入與刪除復雜度&#xff01;本文將從底層原理切入&…

各測試平臺功能對比分析(ITP,Postman,Apifox,MeterSphere)

對比ITP與Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口測試? 可視化接口調試&#xff0c;支持多種請求方式? 支持? 支持? 支持場景測試? 多接口串聯測試&#xff0c;支持前后置腳本? Collections功能? 支持? 支持定時任務? 基于Celery的定時…