###前提・実現したいこと
今、二つの動画の類似度を評価するために、オプティカルフローをフレームごとに計算し、各点のオプティカルフローのノルムの和をとって格納する、というプログラムを書こうとしています。
以下のサイトを参考にしたのですが、如何せんC++を触れるのが初めてで、上手く書くことができません。
いま、//ここから の下にあるようにmatの和を取ろうとしたのですが、cvmMatがないと怒られてしまいます。
行列計算の仕方を教えていただけないでしょうか。
http://whoopsidaisies.hatenablog.com/entry/2013/12/15/020420
#include <opencv2/opencv.hpp> #include <opencv2/superres/optical_flow.hpp> using namespace cv; using namespace cv::superres; int main() { // 動画ファイルの読み込み VideoCapture capture = VideoCapture("mizuguchi_movie.mov"); // TV-L1アルゴリズムによるオプティカルフロー計算オブジェクトの生成 Ptr<DenseOpticalFlowExt> opticalFlow = superres::createOptFlow_DualTVL1(); // 前のフレームを保存しておく Mat prev; capture >> prev; //ここから Mat sum_X; Mat sum_Y; Mat tmpX; Mat tmpY; //ここまで while (waitKey(1) == -1) { // 現在のフレームを保存 Mat curr; capture >> curr; // オプティカルフローの計算 Mat flowX, flowY; opticalFlow->calc(prev, curr, flowX, flowY); //ここから tmpX = sum_X; tmpY = sum_Y; cvmAdd(sum_X,tmpX,flowX); cvmAdd(sum_Y,tmpY,flowY); //ここまで // オプティカルフローの可視化(色符号化) // オプティカルフローを極座標に変換(角度は[deg]) Mat magnitude, angle; cartToPolar(flowX, flowY, magnitude, angle, true); // 色相(H)はオプティカルフローの角度 // 彩度(S)は0~1に正規化したオプティカルフローの大きさ // 明度(V)は1 Mat hsvPlanes[3]; hsvPlanes[0] = angle; normalize(magnitude, magnitude, 0, 1, NORM_MINMAX); // 正規化 hsvPlanes[1] = magnitude; hsvPlanes[2] = Mat::ones(magnitude.size(), CV_32F); // HSVを合成して一枚の画像にする Mat hsv; merge(hsvPlanes, 3, hsv); // HSVからBGRに変換 Mat flowBgr; cvtColor(hsv, flowBgr, cv::COLOR_HSV2BGR); // 表示 cv::imshow("input", curr); cv::imshow("optical flow", flowBgr); // 前のフレームを保存 prev = curr; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。