opencv-python 使用中遇到的问题
目錄
- 前言
- 1. opencv-python 與 opencv-contrib-python 的關系
- - 問題描述
- - 原因分析
- - 解決方法
- 2. 人臉檢測函數 detectMultiScale 調用后卡住,程序無法停止
- - 問題描述
- - 原因分析
- - 解決方法
- 3. cv2.waitKey(0) 關閉窗口后程序不自動停止
- - 問題描述
- - 原因分析
- - 解決方法
- 4. cv2.Stitcher_create(False).stitch() 圖像拼接函數卡住無法停止(2022.11.02更新)
- - 問題描述
- - 原因分析
- - 解決方法
前言
筆者在進行人臉識別實驗時,調用了 cv2 模塊的相關函數,但是在使用時遇到了一些問題,現記錄如下。
1. opencv-python 與 opencv-contrib-python 的關系
- 問題描述
利用 pip 安裝好 opencv-python 之后,發現有一些函數無法調用。例如:cv2.face.EigenFaceRecognizer_create() 等等。
- 原因分析
參考 Opencv-contrib-python與opencv-python有何不同? - 知乎用戶的回答 - 知乎 可知,
- run pip install opencv-python if you need only main modules
- run pip install opencv-contrib-python if you need both main and contrib modules (check extra modules listing from OpenCV documentation)
即意味著:
- 解決方法
自然是安裝 opencv-contrib-python 即可,不過一定要注意版本,后續筆者遇到的各種問題也是由于 opencv-contrib-python 不同版本的bug。
2. 人臉檢測函數 detectMultiScale 調用后卡住,程序無法停止
- 問題描述
筆者在進行人臉檢測實驗時,發現寫的程序完成所有功能后一直在運行,具體表現如下:
筆者的人臉檢測代碼是這樣的:
import cv2# 讀取待檢測的圖像 image = cv2.imread('test1.jpg') # 獲取xml文件,加載人臉檢測器 faceCascade = cv2.CascadeClassifier('opencv-files/lbpcascade_frontalface.xml') # 轉換為灰度圖像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 調用函數detectMultiScale faces = faceCascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5,minSize=(5, 5), )print(faces) # 打印輸出測試結果 print("發現{0}個人臉!".format(len(faces))) # 逐個標記人臉 for (x, y, w, h) in faces:cv2.circle(image, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 2) # 顯示結果 cv2.imshow("dect", image) # 保存檢測結果 cv2.waitKey(0) cv2.destroyAllWindows()經過debug,最終發現是 opencv 自帶的人臉檢測函數 detectMultiScale 導致了程序無法停止,它雖然正確輸出了人臉的正確坐標,其后續的命令也正常運行,但是這個函數在某種程度上阻塞了整個程序,使得程序在完成功能后無法自動停止。查詢資料發現,有網友遇到了相同的問題1,其問題也定位在 detectMultiScale 函數上。
- 原因分析
查詢資料發現,有網友給出了方法2:他認為原因是少寫了一個 flags 參數,并且重啟電腦就好了。但是,筆者嘗試之后發現并沒有任何效果。
筆者嘗試在代碼中加入 sys.exit() 等強制停止的命令,但是這個強制停止的命令卻無法執行。筆者還嘗試了 cv2.setNumThreads(0) 等強行使得程序單進程運行的命令,但是依舊無效。
最后,在 stackoverflow 找了同樣的問題3。這應該是模塊的一個bug,雖然提問者沒有最終解決問題,但是他發現了只有opencv-contrib-python在特定版本才會出現這種問題。其發現如下3:
雖然外國網友將此bug反饋給了官方,不過筆者使用目前(2021年6月)最新的版本時依然存在這個問題。
- 解決方法
發現是 opencv-contrib-python 版本的問題后,解決的方法也很簡單,安裝前文中前3類的版本即可。不過筆者實測發現,其實就算用了第二、三類的版本,程序也沒有報出警告,但是問題確實解決了。
3. cv2.waitKey(0) 關閉窗口后程序不自動停止
- 問題描述
隨便在三類中挑了一個 opencv-contrib-python 3.x 版本之后,隨即又遇到了另一種情況。筆者手動關閉了彈出來的圖片窗口,但是程序卻還在執行,而之前在程序功能運行完之后,只要把所有的圖片窗口關閉,程序會自動結束運行。有網友也遇到了相似的問題4:
這里涉及到的代碼為:
# 顯示結果 cv2.imshow("dect", image) # 保存檢測結果 cv2.waitKey(0) cv2.destroyAllWindows()- 原因分析
經過試驗,網友的解答4也是正確的。
使用高版本opencv就不會這樣,比如4以上的
- 解決方法
筆者最終安裝了 opencv-contrib-python 的4.1.2.30版本,解決了無法自動停止問題。
4. cv2.Stitcher_create(False).stitch() 圖像拼接函數卡住無法停止(2022.11.02更新)
- 問題描述
和前幾次一樣,筆者在運行圖像拼接函數時,發現出現了和前述問題二、三中一樣的情況,即程序運行完畢后卡死,無法自動退出。筆者的 OpenCV 版本為 4.2.0.32,涉及的卡死代碼大致為5:
import sys import cv2 ...# stitcher = cv2.createStitcher(False) # OpenCV 3.x stitcher = cv2.Stitcher.create(cv2.Stitcher_PANORAMA) # OpenCV 4.x(status, pano) = stitcher.stitch((img1, img2)) if status != cv2.Stitcher_OK:print("不能拼接圖片, error code = %d" % status)sys.exit(-1) print("拼接成功.")通過定位,發現原因在于 stitcher.stitch((img1, img2)) 一句中,但是筆者發現加入常用的python退出語句也不起作用。
- 原因分析
這次遇到的是和前幾次相同的問題,最終程序無法自動停止的原因是由于 OpenCV 自身的BUG導致。根本原因是OpenCV內部為了加速計算,某些算法使用了多線程機制,但是卻沒有退出線程,或者多線程出現段錯誤導致死鎖,進而導致程序卡住,線程阻塞,無法自動停止。
- 解決方法
其中核心語句為:cv2.ocl.setUseOpenCL(False)
而另一個語句 cv2.setNumThreads(0) 則親測無效。
急!!!opencv-python做人臉模型建立,程序運行完畢,但是不會結束進程,為什么? ??
關于python版opencv 運行人臉檢測函數classfier.detectMultiScale會卡主的問題 ??
OpenCV with Python wont exit properly when using detectMultiScale on CascadeClassifier ?? ??
cv2.waitKey用鼠標點擊一直執行 ?? ??
python調用stitcher類自動實現多個圖像拼接融合功能 ??
Pytorch Dataloader、OpenCV出現死鎖可能的解決方案 ??
總結
以上是生活随笔為你收集整理的opencv-python 使用中遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XSS绕过,XSS过滤速查,XSS绕过姿
- 下一篇: vue3使用useMouseInElem