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

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

ただいまの
回答率

90.50%

  • C

    3696questions

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

  • C++

    3455questions

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

  • OpenCV

    1080questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 474

carnage0216

score 122

<環境>

  • 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;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

こんにちは。

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

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

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

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

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

  3. ボールをキャッチできるマニピュレータの開発
    カゴを移動して受け取る程度でもかなり大変と思います。質量の大きなものを高応答性能で動かすのは難易度高いですから。工業用ロボットの中にはもしかすると対応できるものがあるかも?

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/02 14:21

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

    キャンセル

  • 2018/06/02 14:35

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

    キャンセル

  • 2018/06/02 17:57

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

    キャンセル

  • 2018/06/02 18:29

    ボールをキャッチする際に「位置ではなく時間」を使って何をしようとしているのか理解できません。

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

    キャンセル

  • 2018/06/03 05:11

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/02 14:22

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Opencvのサンプルコードが動かない

    http://kivantium.hateblo.jp/entry/20120822/p1 こちらにあるサイトのソースコードをコンパイルしたのですが、kinectに移りません。

  • 解決済

    Python2.7.10のIndexError: only integers, sliceの対処方

    前提・実現したいこと Python2.7.10を使用してparticlefilterを実装したいです. python + numpyで緑色の物体を追跡する (パーティクルフ

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 解決済

    OpenCvSharp3で重心を求めたいです

    以下のように、ラベリングを実行するプログラムはできたのですが、ここから重心の座標や面積を求めるプログラムを作成したいです。どなたか、教えていただけますか? 最終的な目標としては

  • 解決済

    opencv 円検出

    前提・実現したいこと 動画を読み込みその動画から円を検出して描画するプログラムを書こうと思っています。 発生している問題・エラーメッセージ 動画は読み込んで出力することができま

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

  • 解決済

    opencvの処理をリアルタイムに

    処理が途中でとまり、 処理後フォルダにaviファイルは保存されるのですが2秒ほどの動画となってしまいます 動画を撮り続けて自分で止めたい場合どのようにすればよいでしょうか アドバイ

  • 解決済

    Python3+opencv3で矩形内のリアルタイム検知がしたいです

    お世話になっております。 今回は、python3 + opencvにて以下のようなことをやりたいと考えているのですが どのようにすれば実現できるのか分からない為、ご質問させて下

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

  • C

    3696questions

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

  • C++

    3455questions

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

  • OpenCV

    1080questions

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

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