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

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

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

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

C++

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

Q&A

解決済

1回答

2756閲覧

原画像上の座標点を,歪み補正画像上の座標点に変換

chihichihi

総合スコア1

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/12/22 06:25

編集2020/12/22 06:31

前提・実現したいこと

Opencvを用いて指先のなぞり動作の速度[mm/s]を検出したいと考えています.
現在指先に青いマーカーを貼り指先の重心の位置を(u,v)のピクセル値で得ることは出来ています.このピクセルの値から
イメージ説明

の変換式(歪みを考慮)を用いて(x,y)の値に変換したいと考えています.

カメラと指の位置関係はイメージ説明説明](af58af8ae477ecc95f111614c24da93c.jpeg)

となっています.

発生している問題・エラーメッセージ

カメラの内部パラメータ(fx,fy,cx,cy)歪み係数(k1,k2,k3,pa,p2)は求まっています.
また,opencvでは内部パラメータと歪み係数を用いて
Undistort2 (src_img, dst_img, intrinsic, distortion)で画像全体に歪み補正をすることは出来ますがこれを行ってしまうと計算量が多くなってしまうのでこの関数は使いたくないです.

該当のソースコード

C++

1#include <opencv2/opencv.hpp> 2 3 4using namespace std; 5using namespace cv; 6 7 8 9 10int main(void) 11{ 12 13 int U1, V1, U2, V2, U_henka, V_henka, area, width, height; 14 double v,fps; 15 // 動画ファイルを取り込むためのオブジェクトを宣言する 16 VideoCapture video; // 動画ファイルを開く 17 video.open(2); 18 if (video.isOpened() == false) { // 動画ファイルが開けなかったときは終了する 19 return 0; 20 } 21 width = video.get(CAP_PROP_FRAME_WIDTH); // フレーム横幅を取得 22 height = video.get(CAP_PROP_FRAME_HEIGHT); // フレーム縦幅を取得 23 fps = video.get(cv::CAP_PROP_FPS); 24 U1 = 0; 25 V1 = 0; 26 Mat image, channels[3] , red, red_bin; 27 Moments m; 28 29 char v_dis[256]; 30 31 while (1) { 32 U2 = U1; 33 V2 = V1; 34 while (1) { 35 video.read(image); // videoからimageへ1フレームを取り込む 36 if(video.read(image)==true)break; 37 } 38 39 split(image, channels); // RBGに分解 40 red = channels[2]; 41 threshold(red, red_bin, 50, 255, THRESH_BINARY_INV); //閾値50で二値化 42 m = moments(red_bin, true); //二値化画像に重みをもたせる 43 44 area = m.m00; 45 U1 = m.m10 / m.m00; //uの重心を求める 46 V1 = m.m01 / m.m00; //vの重心を求める 47 U_henka = U1 - U2; 48 V_henka = V1 - V2; 49 v = sqrt((U_henka)*(U_henka)+(V_henka)*(V_henka)*60); 50 51 Point2f mc = Point2f(U1,V1); 52 sprintf_s(v_dis, 256, "v=%lf", v); 53 circle(image, mc, 7, Scalar(0, 0, 255), -1); // 元動画に重心を表示 54 printf(" U1 ,""%d,"" V1 ,""%d,\n\n",U1,V1); 55 printf(" U2 ,""%d ,""V2 ,""%d,\n\n",U2,V2); 56 putText(image, v_dis, Point(10, 100), FONT_HERSHEY_SIMPLEX, 2.0, Scalar(0, 255, 255), 2); 57 imshow("R二値化", red_bin); 58 imshow("Rチャンネル", red); 59 imshow("元動画", image); 60 61 // output << image; 62 63 if (cv::waitKey(1) == 'q') break; //qを押すと終了 64 } 65 return 0; 66}

補足情報(FW/ツールのバージョンなど)

opencv,c++共に初心者でこの1点だけの変換をすっと調べていますがなかなかわからない状態で困っています.
よけれはご教授おねがいします,,,,

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

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

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

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

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

guest

回答1

0

ベストアンサー

欲しいのはundistortPoints()でしょうか?

投稿2020/12/22 06:38

fana

総合スコア11708

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

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

chihichihi

2020/12/22 06:51

いまその関数について調べたらそれで求めることが出来るとおもいます.勉強不足ですみません. srcとdstがMatなのは(u,v)と(u',v')を行列で表すということでしょうか?
chihichihi

2020/12/22 07:20

重ねてすみません,, こちら単眼カメラの場合は引数のR,Pはともに単位行列でいいのですか?
fana

2020/12/22 07:32 編集

リファレンスを見てますか? 引数の意味を読み→その解釈が合っているかどうかを実施結果から確かめる ということをご自身で行ってください. 私は実際の実施結果を見ているわけではないので,問いに答えようにも私の(間違っているもしれない)解釈を述べることにしかなりません. (あと,見ているOpenCVのバージョンが違うかもしれないし) 一応,手元の OpenCV 4.0.0 のリファレンスを見た雰囲気では, ・srcの型は書いてあるのでその通りにすればOK.dstも同じ形でよいだろう. ・Rはデフォルト引数値と同じにしておけばよい. ・Pは目的次第.例えば,手元の(fx,fy,cx,cy)を用いたカメラマトリクスを指定する等. という感じですかね.
chihichihi

2020/12/23 05:46

なんでも聞いてしまい申し訳ございません. リファレンスをしっかり見て引数を取ったら所望の値を得ることが出来ました. 丁寧な回答ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問