###前提・実現したいこと
ボールジャグリングの動画のボール部分を円で追跡したい
なぜ輪郭検出の段階でエラーが発生するのかが分からない
膨張処理の段階までは問題なし
今現在は円は一つだけ検出できればOK
###発生している問題・エラーメッセージ
line 56, in <module> image, cnts, hierarchy = cv2.findContours(gray_frame,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) error: ......\modules\imgproc\src\contours.cpp:198: error: (-210) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function cvStartFindContours
###該当のソースコード
Python
1# -*- coding: utf-8 -*- 2""" 3Created on Mon Nov 27 16:39:15 2017 4 5@author: user4 6""" 7 8import cv2 9import numpy as np 10 11# 定数定義 12ESC_KEY = 27 # Escキー 13INTERVAL= 10 # インターバル 14FRAME_RATE = 30 # fps 15 16WINDOW_ORG = "org" 17WINDOW_BACK = "back" 18WINDOW_DIFF = "diff" 19 20neiborhood4 = np.array([[0, 1, 0], 21 [1, 1, 1], 22 [0, 1, 0]], 23 np.uint8) 24 25# ウィンドウの準備 26cv2.namedWindow(WINDOW_ORG) 27 28# 元ビデオファイル読み込み 29mov_org = cv2.VideoCapture("jugg.mp4") 30 31# 最初のフレーム読み込み 32has_next, i_frame = mov_org.read() 33 34# 背景フレーム 35back_frame = np.zeros_like(i_frame, np.float32) 36 37 38# 変換処理ループ 39while has_next == True: 40 # 入力画像を浮動小数点型に変換 41 f_frame = i_frame.astype(np.float32) 42 43 # 差分計算 44 diff_frame = cv2.absdiff(f_frame, back_frame) 45 46 # 背景の更新 47 cv2.accumulateWeighted(f_frame, back_frame, 0.025) 48 49 #閾値処理 50 _, diff_frame = cv2.threshold(diff_frame,127,255,cv2.THRESH_BINARY) 51 #グレースケール化 52 gray_frame = cv2.cvtColor(diff_frame, cv2.COLOR_RGB2GRAY) 53 #膨張処理 54 gray_frame = cv2.dilate(gray_frame,neiborhood4,iterations = 1) 55 #輪郭検出 56 image, cnts, hierarchy = cv2.findContours(gray_frame,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) 57 #輪郭が一つでもあったとき 58 if len(cnts) > 0: 59 #最大の輪郭を検出 60 c = max(cnts, key=cv2.contourArea) 61 #最大面積の最小包囲円の座標と半径を検出 62 ((x, y), radius) = cv2.minEnclosingCircle(c) 63 #円の線画 64 if 70>radius>10: 65 cv2.circle(i_frame, (int(x), int(y)), int(radius),(0, 0, 255), 2) 66 67 # フレーム表示 68 cv2.imshow(WINDOW_ORG,i_frame) 69 70 # Escキーで終了 71 key = cv2.waitKey(INTERVAL) 72 if key == ESC_KEY: 73 break 74 75 # 次のフレーム読み込み 76 has_next, i_frame = mov_org.read() 77 78# 終了処理 79cv2.destroyAllWindows() 80mov_org.release()
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
windows7/Anaconda3.4.4/Spyder3(Python3.5)/OpenCV 3.1.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。