OpenCVのverによる関数の返り値の数の違い

OpenCVのverによる関数の返り値の数の違い
 
OpenCVのverの違いで返り値の数が異なり、エラーを吐いていました。
返り値の数がまさかverで異なる...という意識がなく、ドハマりしたので、経験をシェア。
 
以下はpythonスクリプトopencvをimportして使用する場合の話。
 

◆問題のコード

 
#輪郭を抽出
cnts = cv2.findContours(im2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]#返り値は[1]の値を返す
 
#抽出した枠を描画
for pt in cnts:
    x, y, w, h = cv2.boundingRect(pt)
    #大きすぎたり小さすぎる領域を除去
    if w<30 or w >200: continue
    print(x,y,w,h) #結果を出力
    cv2.rectangle(img, (x,y), (x+w,y+h),(255,0,255),2)
 

◆エラー内容

error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S)
in function 'cv::pointSetBoundingRect'
 

◆原因

openCVのversionによって、cv2.findContours関数の返り値の数は違うようです。
 

◆対策内容

 
修正前
 
#輪郭を抽出
cnts = cv2.findContours(im2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]#返り値は[1]の値を返す
 
修正後
 
#輪郭を抽出
cnts = cv2.findContours(im2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]#返り値は[0]の値を返す
 

◆結果

 
上記の修正により輪郭情報を正しく描画する処理が通るようになりました
花びらの輪郭を2値化後の画像から抽出するプログラムです。

f:id:Appkun:20190203182034p:plain

花びらの輪郭抽出結果