計算機視覺--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/bicheng/92481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92481.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92481.shtml

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

相關文章

Centos6停止服務后yum改用阿里云

環境: OS:Centos 6.9 1.進入到yum配置目錄 cd /etc/yum.repos.d 2.備份 cp CentOS-Base.repo CentOS-Base.repo.bk 3.下載 wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo 問題1: 因為Centos-6早就停止了更新維護,阿里云鏡像網站將其倉庫…

putty+Xming(XLaunch) 遠程登錄VirtualBox中的Ubuntu24.04,顯示圖形化(GUI)界面

測試環境:VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 Server(no desktop),均測試成功。 一、先測試putty遠程登錄VirtualBox中的Ubuntu,可以使用ssh、Telnet 等協議。參見拙文《ssh連接VirtualBox中的Ubuntu24.04(win11、put…

SpringBoot微頭條實戰項目

一、項目概述 微頭條是一個基于現代技術棧構建的新聞發布和瀏覽平臺,旨在為用戶提供便捷的新聞閱讀體驗和高效的新聞管理功能。該項目通過前后端分離的架構設計,實現了用戶注冊、登錄、新聞瀏覽、搜索、發布、修改和刪除等功能,同時通過JWT技…

如何給電腦換個ip地址?電腦換ip幾種方法

更換電腦的IP地址的方法取決于你的具體需求和網絡環境(是換本地局域網IP還是換對外公網IP)。以下是幾種常見的方法: 一、更換本地局域網IP地址(在同一個網絡內) 這個IP地址通常由你的路由器(或公司的網絡管…

Pytest項目_day04(Python做接口請求)

Requests包 在python中,可以使用requests包,用于做接口請求和接口測試request支持http和https簡單的get函數調用如下:r.jsonr.status_coder.textget函數的帶params用法post函數的帶params用法 post也可以和get一樣在url中傳入參數在requests包…

Flink與Kafka核心源碼詳解-目錄

Flink是Apache軟件基金會下開源的分布式流批一體計算框架,具備實時流計算和高吞吐批處理計算的大數據計算能力。本專欄內容為Flink源碼解析的記錄與分享。 本文解析的Flink源碼版本為:flink-1.19.0 以下為Flink-1.19.0-完整源碼詳解的目錄導航。 Flink-…

【VLLM篇】:原理-實現

1、VLLM vLLM是一個建立在【PagedAttention】之上的高吞吐的【分布式服務引擎】,目標是【提高吞吐量】、【提高內存利用率】(kv-cache內存利用率高達96%),它的內存管理分配方式從【固定分配】改進為【分頁管理】,類似操…

什么是 TcpCommunicationSpi

&#x1f9e9; 一、核心定位&#xff1a;什么是 TcpCommunicationSpi&#xff1f; /*** <tt>TcpCommunicationSpi</tt> is default communication SPI which uses* TCP/IP protocol and Java NIO to communicate with other nodes.*/翻譯&#xff1a;TcpCommunicat…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 詞云圖-微博評論用戶詞云圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解詞云圖-微博評論用戶詞云圖實現 視頻在線地…

數據結構----棧和隊列認識

目錄 棧&#xff08;后進先出&#xff09; 棧的實現 頭文件 初始化 入棧 注意&#xff1a; bool 判空 出棧----棧頂 注意 出棧頂元素&#xff0c;元素不會刪除 注意&#xff1a; 獲取棧中有效個數 銷毀棧 源文件操作 用棧實現遞歸* 隊列&#xff08;先進先出&a…

【Kafka系列】第二篇| Kafka 的核心概念、架構設計、底層原理

在大數據和分布式系統飛速發展的今天&#xff0c;消息隊列作為高效的通信工具&#xff0c;在系統解耦、異步通信、流量削峰等方面作用顯著。 而 Kafka 這款高性能、高吞吐量的分布式消息隊列&#xff0c;在日志收集、數據傳輸、實時計算等場景中應用廣泛。 接下來&#xff0c;我…

Kafka-exporter采集參數調整方案

#作者&#xff1a;張桐瑞 文章目錄1 問題概述2 修改方案2.1修改參數2.2配置示例3 消費者組均分腳本3.1使用說明3.2腳本內容3.3實現原理說明4 KAFKA-EXPORTER流程代碼4.1KAFKA-EXPORTER拉取數據流程1 問題概述 由于kafka-exporter獲取kafka指標時間過長&#xff0c;無法通過cur…

AT32的freertos下modbus TCP移植

1.準備模板 打開雅特力官網&#xff0c;也就是帶有LwIP的示例。 下載官方源碼&#xff1a;modbus 2.移植 我這里是在這里新建兩個文件夾&#xff0c;分別是modbus與port&#xff0c;這個任意&#xff0c;只需要將必要的文件加入項目即可。 將源碼中的modbus這些都移植過來&a…

Redis面試精講 Day 16:Redis性能監控與分析工具

【Redis面試精講 Day 16】Redis性能監控與分析工具 開篇 歡迎來到"Redis面試精講"系列第16天&#xff0c;今天我們將深入探討Redis性能監控與分析工具。在大型分布式系統中&#xff0c;Redis作為關鍵的數據存儲和緩存組件&#xff0c;其性能指標直接影響整個系統的…

vue3+vue-flow制作簡單可拖拽可增刪改流程圖

實現效果實現代碼 準備工作 安裝依賴 npm install vue-flow/core npm install vue-flow/minimap //小地圖 npm install vue-flow/controls //自帶的縮放、居中、加鎖功能我這里只用到上述三個&#xff0c;還有其余的可根據實際情況配合官方文檔使用。 npm install vue-flow/bac…

itextPdf獲取pdf文件寬高不準確

正常情況下我們通過下面方式獲取寬高PdfReader reader new PdfReader(file.getPath()); float width reader.getPageSize(1).getWidth(); float height reader.getPageSize(1).getHeight();但是這樣獲取的寬高是不準確的&#xff0c;永遠都是 寬 > 高&#xff0c;也就是橫…

NodeJs學習日志(2):windows安裝使用node.js 安裝express,suquelize,mysql,nodemon

windows安裝使用node.js 安裝express&#xff0c;suquelize&#xff0c;mysql&#xff0c;nodemon 系統是win10&#xff0c;默認已經安裝好nodejs與npm包名作用expressWeb應用框架suquelize數據庫ORMmysql數據庫nodemon代碼熱重載安裝express 添加express生成器 npm add expres…

VueCropper 圖片裁剪組件在Vue項目中的實踐應用

VueCropper 圖片裁剪組件在Vue項目中的實踐應用 1. 組件介紹 VueCropper 是一個基于 Vue.js 的圖片裁剪組件&#xff0c;它提供了豐富的圖片裁剪功能&#xff0c;包括&#xff1a; 圖片縮放、旋轉、移動固定比例裁剪高質量圖片輸出多種裁剪模式選擇 2. 安裝與引入 首先需要安裝…

給同一個wordpress網站綁定多個域名的實現方法

在WordPress網站上綁定多個域名&#xff0c;可以通過以下幾種方法實現&#xff1a; 1. 修改wp-config.php文件 在wp-config.php文件中&#xff0c;找到define(‘WP_DEBUG’, false);&#xff0c;在其下方添加以下代碼&#xff1a; define(WP_SITEURL, http:// . $_SERVER[HT…

HarmonyOS分布式開發實戰:打造跨設備協同應用

&#x1f4d6; 文章目錄 第一章&#xff1a;HarmonyOS分布式架構揭秘第二章&#xff1a;跨設備協同的核心技術第三章&#xff1a;開發環境搭建與配置第四章&#xff1a;實戰項目&#xff1a;智能家居控制系統第五章&#xff1a;數據同步與狀態管理第六章&#xff1a;性能優化與…