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

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

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

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

OpenCV

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

C++

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

Q&A

解決済

2回答

2363閲覧

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

carnage0216

総合スコア194

C

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

OpenCV

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

C++

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

0グッド

0クリップ

投稿2018/06/17 17:44

編集2018/06/21 10:12
#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より球体の進む放物線が得られます。
得られた放物線を式からグラフを描画する方法はないでしょうか?

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

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

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

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

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

YomogiKOBO

2018/06/17 18:05

予測するのにcvWaitKey(10)と関数を使っているのは何故?
fana

2018/06/21 10:14

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

2018/06/21 10:16

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

2018/06/22 01:43

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

回答2

0

ベストアンサー

大量の画像や座標のデータとカメラから入力された検出されたボールの位置の座標を比較する関数は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 10:11

編集2018/06/21 10:08
episteme

総合スコア16614

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

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

carnage0216

2018/06/18 10:30 編集

どうもありがとうございます。 >>OpenCVに何を期待してんです? opencvになら画像処理に関しての予測する関数があると思っていました。 ほんとに何を期待しているんだか自分に問いたいです。 epistemeさんの提供していただいたアルゴリズムを基にプログラムを作ってみます。 いつもいつもどうもありがとうございます。
carnage0216

2018/06/18 12: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点の差から求めるプログラムを組み込めば良いと考えているのですが正しいでしょうか?
YomogiKOBO

2018/06/18 14:22

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

2018/06/18 19:34

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

2018/06/19 07:08

cvQueryFrame関数は、1コマを切り取っているだけですよ。 速度計算や移動方向をどうやって算出するのでしょうかねぇ・・ 過去の質問(https://teratail.com/questions/129124)と回答から何を学んだのだろうか。。
fana

2018/06/21 05:01

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

2018/06/21 07:40

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

2018/06/21 10:13

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

2018/06/21 10:33

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

2018/06/21 10:35

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

2018/06/21 10:52 編集

画像上に写るボールの像の大きさは,カメラからボールが遠いほど小さく,近いほど大きくなるわけですから,用いるボールのサイズが既知であるならば,カメラの内部パラメータさえ事前の校正作業で得ておけば,画像上での検出結果(x,y,r)から,カメラ座標系におけるボールの中心の3次元座標を推定できますよね. #本題ではありませんが,このコード,ループ内でgray_imgがどんどんリークしませんかね.src_imgに対するcvReleaseImage()とかもやっちゃいかんのでは.
guest

0

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

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

投稿2018/06/20 17:00

YomogiKOBO

総合スコア187

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

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

carnage0216

2018/06/21 07:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問