前提・実現したいこと
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点だけの変換をすっと調べていますがなかなかわからない状態で困っています.
よけれはご教授おねがいします,,,,
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/22 06:51
2020/12/22 07:20
2020/12/22 07:32 編集
2020/12/23 05:46