2020/11/8

python 3 and opencv3.4.2 ..imshow fail. --- centor of contours

一個 imshow 就 fail 掉:
cv2.error: OpenCV(3.4.2) /tmp/build/80754af9/opencv-suite_1535558553474/work/modules/highgui/src/window.cpp:632: 
error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. 
If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, 
then re-run cmake or configure script in function 'cvShowImage'

結果follow 這一個:
conda remove opencv
conda install -c conda-forge opencv=4.1.0
..意思是說..3.4.2 板的沒有enable WITH_GTK=ON ?

haha 6 月的時後,已經發生過了...

另外,很有趣,python 因為可以return tuple type,所以function 把 rc code(success, fail) 和 process result 包成一個 tuple 傳回來。
所以,以 opencv 的 threshold( ) function:
rc, out = cv2.threshold(blurred,60,255,cv2.THRESH_BINARY)
rc 是 成功或失敗,out 是 threshold 處理以後的結果。
如果要直接拿結果,不管成功失敗,可以直接取 tuple 的 elememt:
out = cv2.threshold(blurred,60,255,cv2.THRESH_BINARY)[1]


依照這篇文章,利用findContour找出輪廓,再用moments 找出輪廓中心座標的 code,在: 加上了最小面積偵測,如果太小就不採用。(實際上是遭遇到雜訊點面積為0的錯誤)
另外,為了考慮能porting 到 embedd system,所以拿掉而外的 module。
參考文章說的,findcontours 的傳回格式跟opencv 版本有關。

這一篇是同樣方法的中文版本,說得更清楚,也有用實際照片做例子
-- 看起來這是標準的方法...

這一篇是用C++的example,如果python porting 不上去,或是 bsp 的 opencv port 沒有support python時,可以用C++做。
-- 參考他的作法,改成跟python 版 一樣的 algorithm 版本的 C++ code,一樣在 github project 中。

沒用用到什模特殊的,最後一個 commit,把 show image 的部份刪除就可以在 target board 上 run 了,用存檔來檢查每一個 process 的結果。

沒有留言:

張貼留言