質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

ボール判定するプログラム

snake207
snake207

総合スコア13

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

3635閲覧

投稿2018/10/01 11:16

編集2018/10/07 03:33

目標(やりたいこと)

選択した範囲内にボールが入ったかどうか判定したい

質問内容

どのようにすれば、ボール判定できるか?

Python

# -*- coding: utf-8 -*- import numpy as np import cv2 from time import time import subprocess VIDEO_DATE = "tennis.AVI" WINDOW_NAME = "MouseEvent" def dilation(dilationSize, kernelSize, img): # 膨張した画像にして返す kernel = np.ones((kernelSize, kernelSize), np.uint8) element = cv2.getStructuringElement(cv2.MORPH_RECT, (2 * dilationSize + 1, 2 * dilationSize + 1), (dilationSize, dilationSize)) dilation_img = cv2.dilate(img, kernel, element) return dilation_img def detect(gray_diff, thresh_diff=95, dilationSize=9, kernelSize=20): # 一定面積以上の物体を検出 retval, black_diff = cv2.threshold(gray_diff, thresh_diff, 255, cv2.THRESH_BINARY) # 2値化 dilation_img = dilation(dilationSize, kernelSize, black_diff) # 膨張処理 img = dilation_img.copy()   image, contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 境界線検出   ball_pos = [] for i in range(len(contours)): # 重心位置を計算 count = len(contours[i]) area = cv2.contourArea(contours[i]) # 面積計算 x, y = 0.0, 0.0 for j in range(count): x += contours[i][j][0][0] y += contours[i][j][0][1] x /= count y /= count x = int(x) y = int(y) ball_pos.append([x, y]) return ball_pos, img def displayCircle(image, ballList, thickness=5): for i in range(len(ballList)): x = int(ballList[i][0]) y = int(ballList[i][1]) cv2.circle(image, (x, y), 10, (0, 0, 255), thickness) return image def resizeImage(image, w=2, h=2): height = image.shape[0] width = image.shape[1] resizedImage = cv2.resize(image, (int(width / w), int(height / h))) return resizedImage def blackToColor(bImage): colorImage = np.array((bImage, bImage, bImage)) colorImage = colorImage.transpose(1, 2, 0) return colorImage class PointList(): def __init__(self, npoints): self.video = cv2.VideoCapture(VIDEO_DATE) self.frame = None self.npoints = npoints self.ptlist = np.empty((npoints, 2), dtype=int) self.pos = 0 cv2.setMouseCallback(WINDOW_NAME, self.onMouse) def add(self, x, y): if self.pos < self.npoints: self.ptlist[self.pos, :] = [x, y] self.pos += 1 return True return False def run(self): ok, self.frame = self.video.read() # 最初のフレームを読み込む if not ok: print('Cannot read video file') sys.exit() self.frame_pre = self.frame.copy() while True: ok, self.frame = self.video.read() # フレームを読み込む if not ok: break self.frame_next = self.frame.copy() if(self.pos == self.npoints): cv2.line(self.frame, (self.ptlist[0][0], self.ptlist[0][1]), (self.ptlist[1][0], self.ptlist[1][1]), (0, 255, 0), 3) cv2.line(self.frame, (self.ptlist[1][0], self.ptlist[1][1]), (self.ptlist[2][0], self.ptlist[2][1]), (0, 255, 0), 3) cv2.line(self.frame, (self.ptlist[2][0], self.ptlist[2][1]), (self.ptlist[3][0], self.ptlist[3][1]), (0, 255, 0), 3) cv2.line(self.frame, (self.ptlist[3][0], self.ptlist[3][1]), (self.ptlist[0][0], self.ptlist[0][1]), (0, 255, 0), 3) color_diff = cv2.absdiff(self.frame_next, self.frame_pre) # フレーム間の差分計算 gray_diff = cv2.cvtColor(color_diff, cv2.COLOR_BGR2GRAY) # グレースケール変換 retval, black_diff = cv2.threshold(gray_diff,30, 255, cv2.THRESH_BINARY) ball, dilation_img = detect(gray_diff) self.frame = displayCircle(self.frame, ball, 2) # 丸で加工 cImage = blackToColor(dilation_img) # 2値化画像をカラーの配列サイズと同じにする self.frame_pre = self.frame_next.copy() # 次のフレームの読み込み cv2.imshow(WINDOW_NAME, self.frame) if cv2.waitKey(10) ==27: # Escキーで抜ける break def onMouse(self,event, x, y, flag, params): if event == cv2.EVENT_MOUSEMOVE: # マウスが移動したときにx線とy線を更新する self.frame2 = np.copy(self.frame) h, w = self.frame2.shape[0], self.frame2.shape[1] cv2.line(self.frame2, (x, 0), (x, h - 1), (255, 0, 0)) cv2.line(self.frame2, (0, y), (w - 1, y), (255, 0, 0)) cv2.imshow(WINDOW_NAME, self.frame2) if event == cv2.EVENT_LBUTTONDOWN: # レフトボタンをクリックしたとき、ptlist配列にx,y座標を格納する if self.add(x, y): print('[%d] ( %d, %d )' % (ptlist.pos - 1, x, y)) cv2.circle(self.frame, (x, y), 3, (0, 0, 255), 3) cv2.imshow(WINDOW_NAME, self.frame) else: print('All points have selected. Press ESC-key.') if __name__ == '__main__': cv2.namedWindow(WINDOW_NAME) npoints = 4 ptlist = PointList(npoints) ptlist.run() cv2.destroyAllWindows()

参考にした文献(URL)

マウスで範囲選択
ボールの軌道抽出

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。