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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2723閲覧

投げられたボールの動きを自分に取り付けたカメラで予測してキャッチするには。(編集 ボールの軌跡を固定したカメラから予測するプログラムを作るまでの準備として)

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/06/01 21:07

編集2018/06/03 11:58

<環境>

  • Windows10 64bit
  • Opencv3.4.1

題名に書いたように投げられたボールの動きを自分に取り付けたカメラで予測してキャッチするプログラムを組みたいと考えています。
パーティクルフィルタなどが使えるのではないかと考えています。
しかし、問題があります。
カメラを固定するわけではないのでカメラが動くと検出したボールの座標が変わってしまいます。なので、
カメラの動きを考慮しながらボールの座標がカメラが動く以前に検出したボールの座標と同じでないとなりません。
以上の方法をどうすれば実装できるのか悩んでいます。もしかしたら間違った考えをしているかもしれません。
もしopencvの方に以上のような問題が解決できるようなプログラムがあるならば教えていただけると助かります。
どうかよろしくお願いいたします。

<編集6/03>
<環境>

  • Windows10 64bit
  • Opencv3.4.1
  • visual studio 2107

カメラは固定することにしました。
以前の質問とは異なる内容になってしまい申し訳ありません。
まずは検出したボールの座標を表示するプログラムを作りたいです。
ボールを検出するプログラムはOpencvを利用しました。
しかし、検出したいボールの座標を表示する上でどのようにxy座標を設定すればよいのでしょうか?

こちらが円を検出するプログラムです。

#include <stdio.h> #include <opencv/cv.h> #include <opencv/highgui.h> int main(int argc, char* argv[]) { int i; float *p; double w = 320, h = 240; IplImage *src_img = 0, *gray_img = 0; CvMemStorage *storage; CvSeq *circles = 0; CvCapture *capture = 0; /* この設定は,利用するカメラに依存する */ capture = cvCreateCameraCapture(0); // (2)キャプチャサイズを設定する. cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, w); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, h); cvNamedWindow("circles", CV_WINDOW_AUTOSIZE); while (1) { src_img = cvQueryFrame(capture); CvSize sizeOfImage = cvGetSize(src_img); //IplImage *gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); // グレイスケールに変換 cvCvtColor(src_img, gray_img, CV_BGR2GRAY); //src_img_gray = cvQueryFrame (capture); // (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい) cvSmooth(gray_img, gray_img, CV_GAUSSIAN, 11, 11, 0, 0); storage = cvCreateMemStorage(0); // (3)ハフ変換による円の検出と検出した円の描画 circles = cvHoughCircles(gray_img, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50, 10, MAX(gray_img->width, gray_img->height)); for (i = 0; i < circles->total; i++) { p = (float *)cvGetSeqElem(circles, i); cvCircle(src_img, cvPoint(cvRound(p[0]), cvRound(p[1])), 3, CV_RGB(0, 255, 0), -1, 8, 0); cvCircle(src_img, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); } // (4)検出結果表示用のウィンドウを確保し表示する cvShowImage("circles", src_img); cvWaitKey(10); } cvDestroyWindow("circles"); cvReleaseImage(&src_img); cvReleaseImage(&gray_img); cvReleaseMemStorage(&storage); return 0; }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

カメラを固定するわけではないのでカメラが動くと検出したボールの座標が変わってしまいます。

カメラを固定しない場合、カメラの向きや平行移動を把握して、それを使ってボールの3D座標を補正する処理を行うことになると思います。

課題が少なくとも3つあると思います。

  1. ボールの3D座標を検出する方法

普通のカメラ1台で条件を限定しない場合は無理です。
原理的に1台では2D検出しかできませんので、奥行きを測れません。
Kinectのような距離画像を撮像できるカメラを用いるか、カメラ2台使ってステレオの原理を使うかと思います。
前者は恐らくポケットマネーで買える価格帯のものでは精度不足でボールをキャッチできないと思います。
後者はボールでは画像処理で言う「コーナー」がないので検出そのものが厳しいと思います。サッカーボールなら模様があるのでそれが「コーナー」として使えるかも知れません。

  1. カメラの向きや平行移動を十分な精度で検出する方法

ステッピング・モータ等で視野を適切な範囲へ移動することは可能と思いますが、恐らく十分な精度でボールの位置を推定出来るほどの精度ではカメラの移動を検出できないだろうと思います。
視野内に写っている他の物体を基準として移動を検出する等の工夫が必要になりそうな気がします。

  1. ボールをキャッチできるマニピュレータの開発

カゴを移動して受け取る程度でもかなり大変と思います。質量の大きなものを高応答性能で動かすのは難易度高いですから。工業用ロボットの中にはもしかすると対応できるものがあるかも?

ステレオカメラとカメラの向きと平行移動の補正を勉強するために有用な画像処理ツールがOpenCVには多数含まれています。OpenCVを深く調査されると良いかも知れません。ただし、上記課題そのものを解決する方法まではOpenCVには搭載されていません。

ボール キャッチ ロボット」で検索すると結構でてきました。カルマンフィルターを使っているものがちらほらありました。

投稿2018/06/02 03:35

編集2018/06/02 05:03
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/06/02 05:21

貴重なご意見どうもありがとうございます。 なるほど、ならばKinectを使っての処理を考えることにします。 >>カメラの向きや平行移動を十分な精度で検出する方法 説明不足でした。申し訳ありません。カメラとなるKinectは自分の目の横に取り付けたいと考えています。 Googleグラスのようなスカウターのようにしたいと考えています。 なので、Kinectのセンサを利用して、センサと画像から検出したボールの速さと向きを基に数秒後のボールの軌跡を予想するプログラムを組めないかと考えています。(ただKinectの精度がどの程度なのかは動画でしか見たことがないので可能かどうかはわかりません。)
Chironian

2018/06/02 05:35

言うまでもないことですが、被写体を検出するセンサーの向きや位置が未知の状態で、そのセンサーが検出している被写体の位置を特定する術はないですよ。
carnage0216

2018/06/02 08:57

どうもありがとうございます。あの、Kinectのセンサを用いて位置ではなく時間で球体の方向と速度を推測するあるいは把握する事は出来ないでしょうか?
Chironian

2018/06/02 09:29

ボールをキャッチする際に「位置ではなく時間」を使って何をしようとしているのか理解できません。 ただ、私も舌足らずな気がしますので補足します。 Kinectを使ってKinectとボールの相対位置をある程度検出できると思います。 そして、マニピュレータもKinectの視界に入れておけば、Kinectとマニピュレータの相対位置を把握出来るかも知れません。(2物体を同時検知できるのかどうか把握していないのであいまいです。) Kinectを介して、ボールとマニピュレータの相対位置を求めることができればキャッチできる可能性があると思います。
carnage0216

2018/06/02 20:11

どうもありがとうございます。 私自身もKinectについてまだよく理解できていない改めてため調べさせて頂きます。 どうもありがとうございました。
guest

0

こんな感じのやつを作りたいのですか?
https://youtu.be/2uFwlaqz4vQ

日本科学未来館の常設展示らしいので、ここに行って質問すれば詳しく教えてもらえるかもしれないです。
東京大学の石川妹尾研究室の研究成果の一部のようです。
http://www.k2.t.u-tokyo.ac.jp/index-j.html

投稿2018/06/02 00:59

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/06/02 05:22

どうもありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問