0 前期教程
- 【項(xiàng)目實(shí)踐】??低暪I(yè)相機(jī)SDK開(kāi)發(fā)小白版入門(mén)教程(VS2015+OpenCV4.5.1)
1 前言
??此前寫(xiě)了一篇基于C++開(kāi)發(fā)??低曄鄼C(jī)的博客,貌似看的人還挺多,收藏量比較高,但其實(shí)當(dāng)時(shí)就知道其實(shí)??低曄鄼C(jī)還可以使用python開(kāi)發(fā),但當(dāng)時(shí)python水平不高,也沒(méi)有深入了解,趁此機(jī)會(huì),好好總結(jié)一下用python開(kāi)發(fā)的一些要點(diǎn)。
2 例程解析
??上面的前期教程在資料查找部分已經(jīng)講得很清楚了,這里就不再贅述。重點(diǎn)看一下官方提供python例程:
這個(gè)路徑下,只有MvImport文件夾是需要導(dǎo)入的庫(kù)文件,其他的都是某個(gè)功能對(duì)應(yīng)的例程,前面兩個(gè)BasicDemo
是比較完善的例程,有圖形界面。
??先隨便找一個(gè)例程看看:
重點(diǎn)是紅框中的內(nèi)容,可以看到這個(gè)例程其實(shí)包含了MvCameraControl_class
這個(gè)包,而這個(gè)包是在上面提到的MvImport
文件夾下,所以在import前要先用append包含進(jìn)這個(gè)路徑。
??但是這樣使用會(huì)存在一個(gè)問(wèn)題,那就是如果在VS Code中開(kāi)發(fā),這樣是不能通過(guò)靜態(tài)檢查的,也就沒(méi)有了代碼提示,用起來(lái)很不方便;而且從源碼交互方面來(lái)說(shuō),這樣要求運(yùn)行這個(gè)代碼的必須要有MVS環(huán)境,這個(gè)是很不優(yōu)雅的。所以建議將MvImport文件夾復(fù)制到項(xiàng)目目錄下,然后以from MvImport.MvCameraControl_class import *
這樣的形式來(lái)導(dǎo)入包,這樣不僅不再需要append路徑操作,而且靜態(tài)檢查也能通過(guò),代碼提示也有了。
??再來(lái)看看MvImport文件夾下的文件:
這里需要注意的是,如果將MvImport文件夾放到項(xiàng)目目錄下,那么該目錄下的文件在import同文件夾腳本時(shí),要注意不能使用本文件的相對(duì)路徑,而要使用項(xiàng)目的相對(duì)路徑!! 這樣才能靜態(tài)檢查通過(guò)。
??另外還有這個(gè)導(dǎo)入的dll文件,使用的是絕對(duì)路徑,感覺(jué)不夠優(yōu)雅,而且可移植性不強(qiáng),還是建議將dll文件復(fù)制到項(xiàng)目目錄下,但是這里需要注意的是,這里實(shí)際調(diào)用的dll文件不止這一個(gè),所以還是把整個(gè)文件夾都復(fù)制進(jìn)去,所以最后項(xiàng)目的整體結(jié)構(gòu)如下:
project_direction:
|-- project.py
|-- ........
|-- MvImport
| |-- CameraParams_const.py
| |-- CameraParams_header.py
| |-- MvCameraControl_class.py
| |-- MvErrorDefine_const.py
| |-- PixelType_header.py
| |-- Win64_x64
| | |-- MvCameraControl.dll
| | |-- .......
然后在導(dǎo)入包時(shí),所有的腳本均以項(xiàng)目目錄為起點(diǎn),以相對(duì)路徑的形式導(dǎo)入包,這樣不僅對(duì)靜態(tài)檢查有利,對(duì)后續(xù)導(dǎo)出執(zhí)行程序也有很大幫助。
3 圖像獲取
??按照上面的步驟,配好了項(xiàng)目結(jié)構(gòu),接下來(lái)就是編程了。由于官方給的代碼注釋比較全面,這里就不再贅述了,主要是搞清楚相機(jī)的運(yùn)行流程,然后按照官方給的例程和手冊(cè)一步一步來(lái)就問(wèn)題不大。
??這里記錄一個(gè)在使用過(guò)程中遇到的問(wèn)題,那就是取圖部分。根據(jù)官方的手冊(cè),取圖主要有兩種方式,如下圖所示:
分別是 MV_CC_GetOneFrameTimeout()
和 MV_CC_GetImageBuffer()
這兩種方式,根據(jù)官網(wǎng)提供的文檔,使用后者的效率更高,但是問(wèn)題在于官方提供的python 例程當(dāng)中,
_MV_FRAME_OUT_
這個(gè)結(jié)構(gòu)體下pBufAddr
數(shù)據(jù)類(lèi)型錯(cuò)了,這種表示方法使得該變量只有一個(gè)unsigned char
類(lèi)型,應(yīng)該還需要乘上該字節(jié)的長(zhǎng)度,但是由于相機(jī)的分辨率是可以自定義的,且不同相機(jī)型號(hào)分辨率不同,因此這里才沒(méi)有設(shè)置乘數(shù)為多少。
??總之因?yàn)檫@個(gè)原因,如果使用 MV_CC_GetImageBuffer()
這個(gè)函數(shù)來(lái)讀取圖像數(shù)據(jù),只能得到一個(gè)字節(jié),其實(shí)也就是空值。所以這里才使用MV_CC_GetOneFrameTimeout()
這種方式來(lái)讀取圖像數(shù)據(jù),或者修改上面的代碼,但這樣牽一發(fā)動(dòng)全身,不好掌握。
??而且官方給出的BasicDemo例程也是基于MV_CC_GetOneFrameTimeout()
來(lái)取圖,所以這里建議優(yōu)先采用后者,具體的使用方式建議參考BasicDemo例程。
參考鏈接文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-604760.html
//更新:
貌似使用MV_CC_GetImageBuffer()
也是可以正常取圖的,需要使用ctypes這個(gè)包里面的一些操作,可以參考這個(gè)鏈接。
4 其他問(wèn)題與解決辦法
-
使用網(wǎng)口轉(zhuǎn)USB模塊連接到電腦無(wú)法識(shí)別設(shè)備:
需要明確的是,網(wǎng)口轉(zhuǎn)USB相當(dāng)于是一個(gè)有線(xiàn)網(wǎng)卡,沒(méi)有連接到互聯(lián)網(wǎng),也就不具有DHCP功能,因此需要手動(dòng)給這個(gè)網(wǎng)卡分配一個(gè)IP地址,這個(gè)IP地址在相機(jī)看來(lái)就是電腦的IP地址,這樣相機(jī)就能正常找到電腦,即電腦也能找到相機(jī)了,另外,二者的IP最好在同一網(wǎng)段,即第三位相同。 -
MVS中識(shí)別到相機(jī),但運(yùn)行Python程序沒(méi)有識(shí)別到,報(bào)錯(cuò)
no data, ret = 80000007
:
這可能是因?yàn)榉阑饓Φ脑?,不妨切換一下所連接WiFi的屬性,比如公用還是專(zhuān)用(原來(lái)公用的換成專(zhuān)用,原來(lái)專(zhuān)用的換成公用):
總之最后保證python.exe公用和專(zhuān)用防火墻都允許,如下圖所示:參考鏈接
5 使用到的python包
??在開(kāi)發(fā)過(guò)程中,使用到很多比較“底層”的包,有點(diǎn)新奇,這里附上一些學(xué)習(xí)鏈接。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-604760.html
-
msvcrt
:輸入交互,參考鏈接 -
threading
:多線(xiàn)程- Lock類(lèi)詳解
- Thread類(lèi)用法詳解
-
ctypes
:架起c/c++和python之間的橋梁- 官方教程
- link1
- link2
- link3
- link4
到了這里,關(guān)于【Python】基于Python和Qt的??低曄鄼C(jī)開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!