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

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

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

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

OpenCV

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

C++

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

Q&A

解決済

1回答

1009閲覧

カメラで取得した映像でオプティカルフローをカラフルに表示

K.Saitoh

総合スコア6

makefile

make は、プログラムのビルド作業を自動化するツールです。コンパイル、リンク、インストール等のルールを記述したテキストファイルをmakefileと呼び、このルールに従ってmakeが自動的にビルドを実行する。

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/07/13 07:01

編集2020/07/13 07:41

実現したいこと、現状

カメラで取得した映像でオプティカルフローをカラフルに表示したいと思ってます。
例:上に移動したら動いた部分のみ赤色の点で表示
hue色調を使って表現したいと思っています。
サンプルコードを色々変更していたらどこを直すべきがわからなくなってしまいました。

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

opt_cam_huedot.cpp:84:35: error: reference to non-static member function must be called cv::line(dispM, p1, p2, hueM.at, 1); ~~~~~^~ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1198:11: note: possible target for call _Tp& Mat::at(int i0) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1213:17: note: possible target for call const _Tp& Mat::at(int i0) const ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1154:11: note: possible target for call _Tp& Mat::at(int i0, int i1) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1165:17: note: possible target for call const _Tp& Mat::at(int i0, int i1) const ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1228:11: note: possible target for call _Tp& Mat::at(int i0, int i1, int i2) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1235:17: note: possible target for call const _Tp& Mat::at(int i0, int i1, int i2) const ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1242:11: note: possible target for call _Tp& Mat::at(const int* idx) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1249:17: note: possible target for call const _Tp& Mat::at(const int* idx) const ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1256:11: note: possible target for call _Tp& Mat::at(const Vec<int, n>& idx) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1263:17: note: possible target for call const _Tp& Mat::at(const Vec<int, n>& idx) const ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1176:11: note: possible target for call _Tp& Mat::at(Point pt) ^ /usr/local/Cellar/opencv/4.3.0/include/opencv4/opencv2/core/mat.inl.hpp:1187:17: note: possible target for call const _Tp& Mat::at(Point pt) const ^ 1 error generated.

該当のソースコード

C++

1#include <opencv2/opencv.hpp> 2#include <opencv2/optflow.hpp> 3 4// 汎用的なHSV値をRGB値に変換する関数 5void hsv2rgb(double h, double s, double v, double *r, double *g, double *b){ 6 // 一般的な色相の間隔にあわせるため!?+90度する 7 if(h < 270) h += 90; 8 else h -= 270; 9 int i = (int)(h / 60.0) % 6; 10 int p, q, t; 11 if(s > 255) s = 255; 12 double f = (double)(h / 60.0f) - (double)((int)(h / 60.0f)); 13 p = (int)(0.5 + v * (1.0f - (s / 255.0f))); 14 q = (int)(0.5 + v * (1.0f - (s / 255.0f) * f)); 15 t = (int)(0.5 + v * (1.0f - (s / 255.0f) * (1.0f - f))); 16 17 switch(i){ // 角度の範囲に応じたRGB値計算 18 case 0 : *r = v; *g = t; *b = p; break; 19 case 1 : *r = q; *g = v; *b = p; break; 20 case 2 : *r = p; *g = v; *b = t; break; 21 case 3 : *r = p; *g = q; *b = v; break; 22 case 4 : *r = t; *g = p; *b = v; break; 23 case 5 : *r = v; *g = p; *b = q; break; 24 } 25} 26 27int main(int argc, char *argv[]){ 28 int c_w = 640, c_h = 480; 29 // カメラ関連 30 cv::VideoCapture cap(0); 31 cap.set(cv::CAP_PROP_FRAME_WIDTH, c_w); 32 cap.set(cv::CAP_PROP_FRAME_HEIGHT, c_h); 33 34 // カメラがオープンできたかの確認 35 if(!cap.isOpened()) return -1; 36 37 // 処理時間 38 cv::TickMeter tm; 39 char strCost[256]; 40 41 int key, i, j; 42 cv::Mat srcM, prevM, nextM, bufM, hueM, dispM; 43 44 // オプティカルフローの初期化 45 cv::Mat flow; 46 cv::Ptr<cv::DenseOpticalFlow> opt = cv::optflow::createOptFlow_SparseToDense(); 47 48 // フロー描画用の変数 49 double dx, dy; 50 int lstep = 10; // この間隔でフローが描画される 51 cv::Point p1, p2; 52 53 // フローのhue描画用の変数 54 hueM = cv::Mat(cv::Size(c_w, c_h), CV_8UC3); 55 double rad, mag, saturation_rate = 7, r, g, b; 56 57 // 第1フレームを取得しておく 58 cap >> bufM; 59 cv::cvtColor(bufM, prevM, cv::COLOR_BGR2GRAY); 60 61 while(1){ 62 tm.reset(); 63 tm.start(); // 処理時間の計測開始 64 cap >> srcM; // キャプチャ 65 dispM = srcM.clone(); 66 67 cv::cvtColor(srcM, nextM, cv::COLOR_BGR2GRAY); 68 69 opt->calc(prevM, nextM, flow); // オプティカルフローの計算 70 71 // 密なオプティカルフローの一部を線で描画 72 for(j = 0; j < flow.rows; j += lstep){ 73 for(i = 0; i < flow.cols; i += lstep){ 74 dx = flow.at<cv::Vec2f>(j, i)[0]; 75 dy = flow.at<cv::Vec2f>(j, i)[1]; 76 rad = cv::fastAtan2(dy , dx); 77 mag = cv::norm(cv::Point(dx , dy)); 78 79 if(cv::norm(cv::Point(dx, dy)) > 1){ 80 p1 = cv::Point(i, j); 81 p2 = cv::Point(i + dx, j + dy); 82 hsv2rgb(rad, mag * saturation_rate, 255, &r, &g, &b); 83 hueM.at<cv::Vec3b>(j, i) = cv::Vec3b(b, g, r); 84 cv::line(dispM, p1, p2, hueM.at, 1); 85 } 86 } 87 } 88 89 tm.stop(); // 処理時間の計測終了 90 sprintf(strCost, "%.0f", tm.getTimeMilli()); // 1フレームあたりの処理時間(ms) 91 cv::putText(srcM, strCost, cv::Point(30, 30), cv::FONT_HERSHEY_PLAIN, 1.4, cv::Scalar(0, 0, 255), 1, cv::LINE_AA); 92 cv::imshow("cap", srcM); 93 cv::imshow("flow hue", hueM); 94 95 key = cv::waitKey(1); 96 if(key == 'q' || key == 27) break; 97 98 prevM = nextM.clone(); // 現フレームの画像を次のループでの前フレーム画像へ 99 } 100 101 cap.release(); 102 return 0; 103}

試したこと

//密なオプティカルフローの一部をドットで描画
の部分を線で表示する処理とhueで表示する処理を一緒にしました。
またcv.line()の色を設定する部分をhueM.atにしました。
もともとは以下の様になっていました。
cv::line(dispM, p1, p2, cv::Scalar(0, 0, 255), 1);

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

Makefile

1TARGETS = opt # コンパイルしたいプログラム名 2SRCS = opt_cam_huedot.cpp 3CC = g++ # 使うコンパイラ 4LIB = 5CFLAGS = -Wall -O2 -std=c++11 6OBJS := $(SRCS:.cpp=.o) 7OBJS := $(addprefix objs/,$(OBJS)) 8OPENCVINC = `pkg-config --cflags opencv4` 9OPENCVLIB = `pkg-config --libs opencv4` 10 11all: $(TARGETS) 12 13$(TARGETS): $(OBJS) 14 $(CC) $(LDFLAGS) -o $@ $(OBJS) $(OPENCVLIB) $(LIB) 15 16objs/%.o: ./%.cpp 17 -mkdir objs 18 $(CC) $(CFLAGS) -c $< -o $@ $(OPENCVINC) $(OPENCVLIB) $(LIB) 19 20clean: 21 rm -rf $(TARGETS) 22 rm -rf objs/*.o 23 rm -rf objs 24 25

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

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

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

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

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

guest

回答1

0

ベストアンサー

cv::Mat srcM, prevM, nextM, bufM, hueM; dispM;

セミコロンがおかしいですよね.

redefinition of 'dx'

変数dxは,もう定義されてますよね.

'break' statement not in loop or switch

breakを使えない箇所にbreakを書いてますよね

…といった,基本的な文法エラーがたくさん出ている様子なので,一個ずつエラーメッセージを読んで,適切にエラーを解消してください.

投稿2020/07/13 07:12

fana

総合スコア11996

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

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

K.Saitoh

2020/07/13 07:16

faneさん そうですね、なかなかうまく行かず休憩せずにやっていたので少し投げやりにとうこうしてしまいました。 処理の部分ではなく簡単なエラーなどは見直してアップロードしたいとおもいます。すみませんでした。
fana

2020/07/13 07:45

落ち着きましょう. 「どうしてもわからない難しいエラーがある」みたいな内容なら,まぁ…という感じですが, 回答に挙げたようなのとか,括弧の数が合わないとか,そういう単純なエラーがもりもり出ている状態だと,【読み手にまともに相手にされる率】が減ってしまうのではないかと.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問