手勢識別中一些錯誤解決方法

Freddy520發表於2018-12-15

最近在看一個手勢識別的專案時,遇到了一些錯誤,主要原因是該專案是使用python2.7+opencv2.4.8,而我的環境是python3.5.2+opencv3.1.0,

於是將一些解決方法記錄下來,希望能夠幫助其他人少走些彎路。

1.       背景分離函式

bg_model = cv2.BackgroundSubtractorMOG2(0, 10.0)

 

報錯:       AttributeError: module `cv2.cv2` has no attribute `BackgroundSubtractorMOG2`

找了一些資料也檢視了opencv3.1.0的官方文件,發現裡面沒有BackgroundSubtractorMOG2(),給的例程是cv2.createBackgroundSubtractorMOG2(),因此將程式碼改為下面,問題解決

bg_model = cv2.createBackgroundSubtractorMOG2()

2.    尋找輪廓函式

contours, hierarchy = cv2.findContours(contour_frame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMP

報錯:        too many values to unpack (expected 2)  這個error資訊是指返回的引數多於接收的

                    但是在檢視 findContours() 時,確實是返回兩個引數:第一個為輪廓的點集,第二個是各層輪廓的索引,但是在檢視其他人部落格,說是實際上返回三個引數,第一個是返回了所處理的影像,後面兩個才是我們所需要的兩個引數,將程式碼改為如下,錯誤解決。

binary, contours, hierarchy = cv2.findContours(contour_frame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMP

3.     報錯:

            cv2.error: D:BuildOpenCVopencv-3.1.0modulespythonsrc2cv2.cpp:163:error: (-215) The data should normally be NULL! in functionNumpyAllocator::allocate

在python檔案開頭加上如下程式碼,問題解決

cv2.ocl.setUseOpenCL(False)

PS:這行程式碼應該是禁用opencl,opencl是一個GPU的加速技術,但是據說在計算量小的時候GPU在資料轉移上耗時佔大頭,還不如不用,至於錯誤的原因,也可能是我的GPU不支援opencl?具體不清楚,以後有機會可以深入研究一下,不過禁用之後確實沒有這個error了

4.      xrange 和 range 的區別,這個是由於python版本的區別,在python3之後貌似是不支援xrange了,換成range就OK了

—————————————————————————————————————————————————————————–

希望可以一起交流進步!

 

相關文章