python opencv 調用 海康威視工業相機(又全又細又簡潔)

1.準備工作

準備一個海康相機

下載MVS 和SDK

海康機器人-機器視覺-下載中心

2.python MVS示例

(說明:MVS里有很多python示例,可以直接運行,但沒有用opencv)

下載完MVS后,我們打開路徑安裝路徑

我的:

D:\soft\MVS\MVS\Development\Samples\Python\BasicDemo

D:\soft\MVS\MVS\Development\Samples\Python\MvImport

可以看到有很多現成的示例。

我們借用一下"D:\soft\MVS\MVS\Development\Samples\Python\BasicDemo\BasicDemo.py"

創建 python項目test_HKcamera

復制BasicDemo.py

發現一片紅,

我們把

D:\soft\MVS\MVS\Development\Samples\Python\BasicDemo

D:\soft\MVS\MVS\Development\Samples\Python\MvImport

里面的文件都復制過來

復制后,如圖所示:

運行后:

成功輸出畫面。

3. python opencv 調用

創建test_HKcamera_opencv文件夾

創建test_hk_opecv.py文件

把第二節的文件復制進來

如圖:

test_hk_opecv.py完整代碼如下:

import cv2
import numpy as np
from MvCameraControl_class import *
from CameraParams_header import *#-------------------opencv操作部分--------------------------------------
def opencv_action(img):#自己定義操作result_img = imgreturn result_img#-----------------------海康相機設置部分---------------------------------------ret = MvCamera.MV_CC_Initialize()
if ret != 0:print(f"初始化SDK失敗,錯誤碼: {ret}")exit()# 枚舉設備
deviceList = MV_CC_DEVICE_INFO_LIST()
n_layer_type = MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE
ret = MvCamera.MV_CC_EnumDevices(n_layer_type, deviceList)
if ret != 0:print("枚舉設備失敗")exit()print(f"找到 {deviceList.nDeviceNum} 臺設備")
if deviceList.nDeviceNum == 0:exit()stDeviceList = cast(deviceList.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contentscamera = MvCamera()ret = camera.MV_CC_CreateHandle(stDeviceList)# 打開設備(使用已創建的句柄)
ret = camera.MV_CC_OpenDevice()
if ret != 0:print(f"打開設備失敗,錯誤碼: {ret}")exit()# 獲取相機參數
width = c_uint()
height = c_uint()
pixel_format = c_uint()
payload_size = c_uint()
stParam = MVCC_INTVALUE()ret = camera.MV_CC_GetIntValue("PayloadSize", stParam)
if ret != 0:print(f"獲取PayloadSize失敗,錯誤碼: {ret}")exit()
payload_size.value = stParam.nCurValue# 獲取寬度
ret = camera.MV_CC_GetIntValue("Width", stParam)
if ret != 0:print(f"獲取寬度失敗,錯誤碼: {ret}")exit()
width.value = stParam.nCurValue# 獲取高度
ret = camera.MV_CC_GetIntValue("Height", stParam)
if ret != 0:print(f"獲取高度失敗,錯誤碼: {ret}")exit()
height.value = stParam.nCurValueprint(width.value,height.value)pixel_format.value = 17301505  # RGB8
# 或
#pixel_format.value = 17301514  # Mono8#曝光時間
exposure_time = 15000  # 單位:微秒
ret = camera.MV_CC_SetFloatValue("ExposureTime", exposure_time)# 開始抓圖
ret = camera.MV_CC_StartGrabbing()
if ret != 0:print(f"開始抓圖失敗,錯誤碼: {ret}")exit()# 分配緩沖區
data_buf = (c_ubyte * payload_size.value)()
data_size = c_uint(payload_size.value)stFrameInfo = MV_FRAME_OUT_INFO_EX()#-----------------------------------------------運行部分---------------------------# 創建OpenCV窗口
cv2.namedWindow("Camera", cv2.WINDOW_NORMAL)try:while True:data_buf = (c_ubyte * payload_size.value)()ret = camera.MV_CC_GetOneFrameTimeout(byref(data_buf),payload_size.value,stFrameInfo,1000)if ret == 0:#print(f"獲取到幀: 寬度={stFrameInfo.nWidth}, 高度={stFrameInfo.nHeight}, "f"像素格式={stFrameInfo.enPixelType}, 幀大小={stFrameInfo.nFrameLen}")frame = np.frombuffer(data_buf, dtype=np.uint8)actual_width = stFrameInfo.nWidthactual_height = stFrameInfo.nHeightif stFrameInfo.enPixelType == 17301505:  # RGB8expected_size = actual_width * actual_height * 3if len(frame) != expected_size:print(f"數據大小不匹配: 期望 {expected_size}, 實際 {len(frame)}")continueframe = frame.reshape((actual_height, actual_width, 3))frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)elif stFrameInfo.enPixelType == 17301514:  # Mono8expected_size = actual_width * actual_heightif len(frame) != expected_size:print(f"數據大小不匹配: 期望 {expected_size}, 實際 {len(frame)}")continueframe = frame.reshape((actual_height, actual_width))elif stFrameInfo.enPixelType == 17301513:  # 可能是 Bayer 格式expected_size = actual_width * actual_heightif len(frame) != expected_size:print(f"數據大小不匹配: 期望 {expected_size}, 實際 {len(frame)}")continueframe = frame.reshape((actual_height, actual_width))frame = cv2.cvtColor(frame, cv2.COLOR_BayerGB2BGR)frame = opencv_action(frame)else:print(f"不支持的像素格式: {stFrameInfo.enPixelType}")breakcv2.imshow("Camera", frame)if cv2.waitKey(1) & 0xFF == ord("q"):breakelse:print(f"獲取圖像失敗,錯誤碼: {ret}")breakfinally:# 停止抓圖camera.MV_CC_StopGrabbing()# 關閉設備camera.MV_CC_CloseDevice()# 銷毀句柄camera.MV_CC_DestroyHandle()# 銷毀窗口cv2.destroyAllWindows()

其中,比較復雜的就是格式的轉換。

海康SDK返回的數據類型(RGB8、Mono8、Bayer格式)轉成NumPy數組。

流程:

? ? A[SDK原始數據] --> B{像素格式判斷}
? ? B -->|RGB8| C[3通道重塑]? ? ? ? ? ? ? ?C --> F[RGB轉BGR]? ? ? ? F --> I[OpenCV顯示]
? ? B -->|Mono8| D[單通道重塑]? ? ? ? ? ??D --> G[灰度圖]? ? ? ? ? ? ? ? G --> I
? ? B -->|Bayer| E[顏色插值轉換]? ? ? ? ? E --> H[Bayer轉BGR]? ? ? ?H --> I


?

運行后

=========================================================

完整代碼如下:

通過網盤分享的文件:py_opencv_HK
鏈接:https://pan.baidu.com/s/1DmrVSV1LT9zGBCRx3nIKAQ

提取碼: usii

===================================

4.花絮

不知道哪個教程教的=-=

# 創建設備句柄handle = c_void_p()stDeviceList = cast(deviceList.pDeviceInfo[0], POINTER(MV_CC_DEVICE_INFO)).contents# 創建相機實例并調用方法(關鍵修正點)
camera = MvCamera()  # 實例化 MvCamera 類#方法一:
ret = camera.MV_CC_CreateHandle(stDeviceList)
#報錯:TypeError: MvCamera.MV_CC_GetIntValue() takes 3 positional arguments but 4 were given#方法二:
#ret = MvCamera.MV_CC_CreateHandle(byref(handle), stDeviceList)
#報錯AttributeError: '_ctypes.CArgObject' object has no attribute 'handle'#方法三:
#ret = MvCamera.MV_CC_CreateHandle(byref(stDeviceList))
#報錯TypeError: MvCamera.MV_CC_CreateHandle() missing 1 required positional argument: 'stDevInfo'#方法四:
#ret = camera.MV_CC_OpenDevice(byref(handle),byref(stDeviceList))
#報錯TypeError: MvCamera.MV_CC_CreateHandle() missing 1 required positional argument: 'stDevInfo'# 打開設備(使用已創建的句柄)
ret = MvCamera.MV_CC_OpenDevice(handle)
if ret != 0:print(f"打開設備失敗,錯誤碼: {ret}")exit()

創建

handle = c_void_p()

就瘋狂報錯。

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

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

相關文章

計算機基礎·linux系統

Finalshell 用于遠程操控vmware中的linux系統 獲取虛擬機的IP地址 ifconfig命令,重啟系統后IP地址可能會變化!問題:vmware子系統沒有網絡連接 winRservices.msc啟動這些服務問題:配置正確但是finalshell連接失敗 更新子系統中的ss…

8.結構健康監測選自動化:實時數據 + 智能分析,遠超人工

第一次接觸結構健康自動化監測系統,感覺成本很高,比人工好在哪里? 人工檢測是依靠目測檢查或借助于便攜式儀器測量得到的信息,但是隨著整個行業的發展,傳統的人工檢測方法已經不能滿足檢測需求,從人工檢測到…

【慕伏白】Android Studio 配置國內鏡像源

文章目錄配置HTTP代理修改 gradle 鏡像地址修改 maven 鏡像源重新同步配置HTTP代理 進入File --> Settings --> Appearance & Behavior --> System Settings --> HTTP Proxy 勾選 Auto-detect proxy settings --> Automatic proxy configuration URL &…

Spring Cloud系列—LoadBalance負載均衡

上篇文章: Spring Cloud系列—Eureka服務注冊/發現https://blog.csdn.net/sniper_fandc/article/details/149937589?fromshareblogdetail&sharetypeblogdetail&sharerId149937589&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link …

如何使用 pnpm創建Vue 3 項目

? 一、什么是 pnpm? pnpm 是一種更快、更高效的 Node 包管理工具,替代 npm 或 yarn,具有: 更快的安裝速度更節省磁盤空間(包復用)嚴格的依賴管理二、使用 pnpm 創建 Vue 項目的完整流程 ? 第一步&#xf…

Vite vs. vue-cli 創建 Vue 3 項目的區別與使用場景

Vite vs. vue-cli 創建 Vue 3 項目的區別與使用場景 Vite 和 vue-cli 都是 Vue 官方推薦的腳手架工具,但它們的架構、構建方式和適用場景有所不同。以下是它們的對比:1. 核心區別對比項Vite (推薦🔥)vue-cli (傳統)構建工具基于 ESM Rollup基…

VC6800智能相機:賦能智能制造,開啟AI視覺新紀元

在工業自動化與智能化浪潮奔涌的今天,精準、高效、智能的視覺檢測已成為提升生產力和品質的關鍵核心。VC6800智能相機應運而生,它不僅僅是一部相機,更是一個集強大視覺硬件與前沿AI算法于一身的 “工業智眼”,正深刻改變著各個領域…

(Python)Python爬蟲入門教程:從零開始學習網頁抓取(爬蟲教學)(Python教學)

一、爬蟲基礎概念 什么是爬蟲? 網絡爬蟲(Web Crawler)是一種自動獲取網頁內容的程序,它像蜘蛛一樣在互聯網上"爬行",收集和提取數據。 爬蟲應用場景: 搜索引擎(Google、百度&#…

dify前端源碼部署詳細教程

這兩天突發奇想,能不能dify源碼部署我只部署個前端,后端、數據庫什么的還是原來docker部署dify的本地部署和遇到的問題。按邏輯來說應該是行得通的,我就親自操作了下試下。 我這邊就以我以前使用docker部署好的1.3.1版本為例。docker安裝參考…

Web地圖服務規范,WMS服務是什么

Web地圖服務規范,WMS服務是什么? WMS,全稱 Web Map Service (網絡地圖服務),是有OGC(開放地理空間信息聯盟)制定的一項標準化協議。他的核心功能是允許客戶端(比如網頁瀏覽器或者GIS桌面軟件)通過互聯網或者…

北京手機基站數據分享:9.3萬點位+雙格式,解鎖城市通信「基礎設施地圖」

今天分享的是——??2023年7月北京市手機基站數據(shpcsv雙格式)??。92,785個基站點位(覆蓋全市16區),WGS84坐標系直接能用,shp格式適配GIS軟件,csv格式方便Excel/Pandas分析!文末…

Druid學習筆記 01、快速了解Druid中SqlParser實現

文章目錄前言介紹Druid代碼目錄介紹模塊一:Parser模塊二:Druid_SQL_AST在Druid SQL Parser中有哪些AST節點類型?熟悉常用的AST節點組成常用的SQLExpr有哪些?常用的SQLStatemment?SQLTableSourceSQLSelect & SQLSelectQuerySQ…

Rust中生命周期的理解與應用

在學習Rust編程語言時,理解生命周期(Lifetime)是非常關鍵的,因為它直接影響到代碼的安全性和性能。今天我們來深入探討Rust中的一個常見問題——生命周期的誤解和正確應用,結合實際代碼實例來說明。 生命周期的基本概念 Rust中的生命周期是用來確保引用(Reference)在其…

智慧感知新體驗:英飛凌雷達在智能家居的創新應用

隨著智慧家居快速發展,感知技術成為實現高效、便捷生活的關鍵。雷達作為非接觸、高精度的感測方案,正在家居應用中展現出巨大潛力。 本次研討會將由英飛凌大中華區雷達應用產品經理 Tommy Wan主講,分享他在智能門鈴、門鎖與安防攝像頭等應用…

AI:新書預告—從機器學習避坑指南(分類/回歸/聚類/可解釋性)到大語言模型落地手記(RAG/Agent/MCP),一場耗時5+3年的技術沉淀—“代碼可跑,經驗可抄”—【一個處女座的程序猿】攜兩本AI

AI:新書預告—從機器學習避坑指南(分類/回歸/聚類/可解釋性)到大語言模型落地手記(RAG/Agent/MCP),一場耗時53年的技術沉淀—“代碼可跑,經驗可抄”—【一個處女座的程序猿】攜兩本AI實戰書終于正式來了! 導讀:大家好&…

數據結構:棧、隊列

一、棧和隊列與鏈表的區別1.鏈表可以在任意位置插入和刪除元素2.棧和隊列只允許在指定位置插入和刪除元素3.棧只允許在棧頂位置入棧和出棧元素3.相同點:表、棧、隊列都是一種線性結構(一對一)4.棧和隊列是一種特殊的表狀結構二、棧&#xff0…

cuda編程筆記(13)--使用CUB庫實現基本功能

CUB 是 NVIDIA 提供的 高性能 CUDA 基礎庫&#xff0c;包含常用的并行原語&#xff08;Reduction、Scan、Histogram 等&#xff09;&#xff0c;可以極大簡化代碼&#xff0c;并且比手寫版本更優化。CUB無需鏈接&#xff0c;只用包含<cub/cub.cuh>頭文件即可需要先臨時獲…

LabVIEW濾波器測控系統

?基于LabVIEW 平臺的高頻濾波器測控系統&#xff0c;通過整合控制與測試功能&#xff0c;替代傳統分離式測控模式。系統以 LabVIEW 為核心&#xff0c;借助標準化接口實現對濾波器的自動化參數調節與性能測試&#xff0c;顯著提升測試效率與數據處理能力&#xff0c;適用于高頻…

美團運維面試題及參考答案(上)

輸入一個字符串,將其轉換成數字時,需要考慮哪些情況(如字符串是否合法、是否為空、int 的范圍、是否為 16 進制等)? 將字符串轉換成數字時,需全面考慮多種邊界情況和合法性問題,具體如下: 字符串基礎狀態:首先需判斷字符串是否為空(長度為0)或僅包含空白字符(如空…

Spring-AI 深度實戰:企業級 AI 應用開發指南與 Python 生態對比(高級篇)

為什么 Spring-AI 是企業級 AI 的“隱形冠軍”&#xff1f;&#xff08;而不僅是另一個封裝庫&#xff09;在 Python 主導的 AI 世界中&#xff0c;Spring-AI 的誕生常被誤解為“Java 的跟風之作”。但真正的企業級 AI 需求&#xff08;事務一致性、分布式追蹤、安全審計&#…