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

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

ただいまの
回答率

90.50%

  • C

    3801questions

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

  • C++

    3567questions

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

  • OpenCV

    1136questions

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

ボールの軌道を予測するプログラムを作りたいです。(カメラは固定するものとします。)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 821

carnage0216

score 122

#include <stdio.h>
#include <opencv/cv.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;

int main(int argc, char* argv[])
{

    int i;
    float *p;
    double w = 3200, h = 2400;

    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;

}


このプログラムは円を検出して円の中心点を赤で表すプログラムです。
投げたボールの軌跡を予測するプログラムを組みたいと考えています。
今、考えているアルゴリズムは検出したボールと数秒後のボールの位置などから、その数秒後にどの位置にボールが存在するかを求めるのに大量の画像、あるいは座標のデータを使って、ボールの位置を予測したいと考えています。
そこで質問なのですが、大量の画像や座標のデータとカメラから入力された検出されたボールの位置の座標を比較する関数はopencvにあるでしょうか?

<編集6/21>
epistemeさんから教えていただいたアルゴリズムが理解できたのは良かったのですが、
>>0.1秒おきに3つの座標が得られたら、放物運動するときの
>>次の0.1秒後の位置は二次方程式解けばわかるじゃん
引用させていただいた文章に関してなのですが、
0.1秒おきに球体から検出した3つの座標が得られることで放物線y=ax^2+bx+cの定数a,b,cが求まり、求まった定数a,b,cより球体の進む放物線が得られます。
得られた放物線を式からグラフを描画する方法はないでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fana

    2018/06/21 19:14

    グラフの書き方は別途質問して回答ももらっているのでは? 何故こちらで再度訊くのですか?

    キャンセル

  • carnage0216

    2018/06/21 19:16

    特に理由はなかったのですが、わかりました。別の質問の方で質問します。

    キャンセル

  • fana

    2018/06/22 10:43

    グラフに関しては(a,b,c)をログにでも出しておいて,オフラインで適当なツールで見るとかではダメなんですかね.(本題の内容ができてないのに,わざわざ横道すぎる問題を新規創出してる感)

    キャンセル

回答 2

checkベストアンサー

+1

大量の画像や座標のデータとカメラから入力された検出されたボールの位置の座標を比較する関数はopencvにあるでしょうか?

話を簡単にするために、1枚の画像から1個の円(x,y,r)を検出するとしよう。
するとカメラからキャプチャしたn枚の画像からn個の円が得られるね。
つまり中心の座標(x,y)の組がn個得られる。

どんだけ動いたかなら2点の差を求めればいいし、
0.1秒おきに3つの座標が得られたら、放物運動するときの
次の0.1秒後の位置は二次方程式解けばわかるじゃん。

OpenCVに何を期待してんです?

[追記] ごめんマチガイ。二次方程式を解くんじゃないね。

画像から得られた3点を通る放物線: y = Axx + Bx + C の
A,B,Cを求めるんだから、未知数3つの連立一次方程式を解く だ。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/18 19:26 編集

    どうもありがとうございます。
    >>OpenCVに何を期待してんです?
    opencvになら画像処理に関しての予測する関数があると思っていました。
    ほんとに何を期待しているんだか自分に問いたいです。

    epistemeさんの提供していただいたアルゴリズムを基にプログラムを作ってみます。
    いつもいつもどうもありがとうございます。

    キャンセル

  • 2018/06/18 21:05

    提供していただいたアルゴリズムを作る上で関数cvHoughCirclesより円を検出して、グレースケール化した円の画像のデータから円(x,y,r)を検出したいのですが、

    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++)のcircles->totalよりtotalに入るのでしょうか?
    だとしたら、totalに入ったグレースケール化された画像から(x,y,r)を検出して、どんだけ動いたかを2点の差から求めるプログラムを組み込めば良いと考えているのですが正しいでしょうか?

    キャンセル

  • 2018/06/18 23:22

    正しいかどうか、それこそ試行錯誤してみろよ

    キャンセル

  • 2018/06/19 04:34

    > グレースケールの円の画像のデータは
    > for (i = 0; i < circles->total; i++)のcircles->totalよりtotalに入るのでしょうか?

    日本語でおk。

    キャンセル

  • 2018/06/19 16:08

    cvQueryFrame関数は、1コマを切り取っているだけですよ。
    速度計算や移動方向をどうやって算出するのでしょうかねぇ・・

    過去の質問(https://teratail.com/questions/129124)と回答から何を学んだのだろうか。。

    キャンセル

  • 2018/06/21 14:01

    固定カメラで滞空中のボールを数秒間撮影(して,そこから数秒後の位置を予測)する実施形態というのがいまいち想像できませんが……
    ボールの運動がカメラから見た奥行方向に大きいならば,像の大きさ(r)から奥行も推定するんでしょうかね.

    キャンセル

  • 2018/06/21 16:40

    >>過去の質問(https://teratail.com/questions/129124)と回答から何を学んだのだろうか。。
    せっかく皆様が手取り足取り親切に教えてくださるのに何も学べていません。本当にすいません。

    キャンセル

  • 2018/06/21 19:13

    >>追記
    どうもありがとうございます。

    キャンセル

  • 2018/06/21 19:33

    別の質問を見るに,この話の最終目的は向ってくるボールをキャッチすることなんですね.
    「3点」で十分な結果が得られるか否かは,問題として想定範囲としているボールの軌跡やキャッチする側の機構と,各時刻の画像上におけるボール位置検出処理の精度次第でしょう.
    3点で不足な場合には観測データ点(X=奥行, Y=高さ,かな?)群に対する「放物線」の当てはめ計算になるかと.

    キャンセル

  • 2018/06/21 19:35

    奥行などまで考慮するとKinectを使う手がありますが、そこまで考えていませんでした。

    キャンセル

  • 2018/06/21 19:41 編集

    画像上に写るボールの像の大きさは,カメラからボールが遠いほど小さく,近いほど大きくなるわけですから,用いるボールのサイズが既知であるならば,カメラの内部パラメータさえ事前の校正作業で得ておけば,画像上での検出結果(x,y,r)から,カメラ座標系におけるボールの中心の3次元座標を推定できますよね.

    #本題ではありませんが,このコード,ループ内でgray_imgがどんどんリークしませんかね.src_imgに対するcvReleaseImage()とかもやっちゃいかんのでは.

    キャンセル

0

https://teratail.com/questions/132161
で放物線に関する質問が投稿されておられましたので。

放物線に関する描画処理、考え方については
ボールの軌跡
OpenCVの描画関数については
OpenCV リファレンス(2.1)
注意 上記URLはOpenCVのversionが古いです。
doxygenのドキュメントで関数の引数や戻り値を再度確認しましょう。
OpenCV リファレンス(3.4.1)
とはいえ、提示されているプログラムコードから描画すべき2点を得る方法を解決しないとね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/21 16:36

    いつもいつも情報提供 ありがとうございます。

    キャンセル

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

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

関連した質問

  • 解決済

    動画から静止画切り出し

    動画から静止画の切り出しをしたいと考えています。 しかし、参考になるサイトを探していても見つかりません。 opencvで動画から静止画を切り出すことは不可能なのでしょうか?

  • 解決済

    opencv 動画 再生

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

  • 解決済

    OpenCvSharp3で重心を求めたいです

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

  • 解決済

    OpenCVを用いた物体検出

    現在OpenCV2.1を用いた上で顔検出にチャレンジしています。 学習等については問題なく行うことができ、顔の検出を行おうと思っているのですが、検出の段階で設定するパラメータの"m

  • 解決済

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

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

  • 解決済

    OpenCVを使って動画の書き出しができない

    aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています. 0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き

  • 解決済

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

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

  • 解決済

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

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

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

  • C

    3801questions

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

  • C++

    3567questions

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

  • OpenCV

    1136questions

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

  • トップ
  • C++に関する質問
  • ボールの軌道を予測するプログラムを作りたいです。(カメラは固定するものとします。)