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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

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

Q&A

解決済

1回答

721閲覧

keypoint変数の中身を別ファイルに展開したい

NMN

総合スコア11

OpenCV

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

C++

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

0グッド

0クリップ

投稿2018/10/09 06:34

編集2018/10/09 09:12

前提・実現したいこと

お世話になります。
特徴点抽出の方法としてfast法を使っているのですが、keypoint内にある特徴点の座標を
別ファイルに記録したいと思っているのですがうまくいきません。
例えば、以下のプログラムで座標を表示しようとする場合どうすればよいかご助言お願いします。
https://www.cresco.co.jp/blog/entry/5504/にあるようなkeypointの展開結果を出したいと思っています。

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

可変長引数をどうやったら表示させれるのかがわからないです。

Cannot pass non-trivial object of type 'std::vector<cv::KeyPoint>'to variadic function; expected type from format string was 'int'

該当のソースコード

C++

1int main(int argc, char *argv[]) 2{ 3 FILE *fp; 4 /*ここにkeypointの中身を記述したい*/ 5 if ((fp = fopen("/Users/name/Desktop/datalist.txt", "w")) == NULL) { 6 printf("file open error!!\n"); 7 exit(EXIT_FAILURE); 8 } 9 cv::Mat img = cv::imread("lenna.png", 1); 10 if(img.empty()) return -1; 11 12 cv::Mat gray_img; 13 cv::cvtColor(img, gray_img, CV_BGR2GRAY); 14 cv::normalize(gray_img, gray_img, 0, 255, cv::NORM_MINMAX); 15 16 std::vector<cv::KeyPoint> keypoints; 17 std::vector<cv::KeyPoint>::iterator itk; 18 19 auto detector=cv::FastFeatureDetector::create(70,false); 20 detector->detect(gray_img, keypoints); 21 fprintf(fp,"%d",keypoints); //ここでエラー 22 cv::Scalar color(100,255,100); 23 for(itk = keypoints.begin(); itk!=keypoints.end(); ++itk) 24 { 25 cv::circle(img, itk->pt, 1, color, -1); 26 cv::circle(img, itk->pt, itk->size, color, 1, CV_AA); 27 if(itk->angle>=0) 28 { 29 cv::Point pt2(itk->pt.x + cos(itk->angle)*itk->size, itk->pt.y + sin(itk->angle)*itk->size); 30 cv::line(img, itk->pt, pt2, color, 1, CV_AA); 31 } 32 } 33 34 fclose(fp); 35 cv::namedWindow("FAST Features",CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO); 36 cv::imshow("FAST Features", img); 37 cv::waitKey(0); 38}

試したこと

ディスクリプタ抽出でいけるのかもと思い、そちらの方もやってみましたがどれをつかえばいいのかわからず、取り敢えず上のような方法でやってみた次第です。

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

MacOS 10.12.6
opencv 3.4.1
xcode 8.3.3
ソースコードのURL http://opencv.jp/cookbook/opencv_img.html#id44

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

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

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

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

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

tiitoi

2018/10/09 06:47

上記コードは修正なしに動きましたが、どのような点が問題なのでしょうか?「エラーがでる」「こういうことがやりたいが方法がわからない」等
fuzzball

2018/10/09 06:49

C++のタグを付けた方がいいと思います。
LouiS0616

2018/10/09 06:50

何を試してどのように上手くいかなかったのか追記してください。
NMN

2018/10/09 07:59

質問を修正致しました。まだ足りない点があれば修正するので回答をできればお願いしたいです。
guest

回答1

0

ベストアンサー

特徴点の x, y 座標及び角度を記録したい場合は以下のようにしてみてはどうでしょうか?意図と違ったら教えてください。

cpp

1#include <iostream> 2#include <vector> 3 4#include <opencv2/opencv.hpp> 5 6int main(int argc, char *argv[]) 7{ 8 cv::Mat img = cv::imread("lena.png"); 9 if (img.empty()) 10 return -1; // 読み込み失敗 11 12 cv::Mat gray_img; 13 cv::cvtColor(img, gray_img, CV_BGR2GRAY); 14 cv::normalize(gray_img, gray_img, 0, 255, cv::NORM_MINMAX); 15 16 auto detector = cv::FastFeatureDetector::create(70, false); 17 std::vector<cv::KeyPoint> keypoints; 18 detector->detect(gray_img, keypoints); 19 20 21 // 描画する。 22 //////////////////////////////////////////////////////// 23 cv::Scalar color(100, 255, 100); 24 for (const auto &p : keypoints) { 25 cv::circle(img, p.pt, 1, color, -1); // 特徴点 26 cv::circle(img, p.pt, p.size, color, 1, CV_AA); // 特徴点の大きさ 27 28 if (p.angle >= 0) { 29 cv::Point pt2( 30 p.pt.x + cos(p.angle) * p.size, p.pt.y + sin(p.angle) * p.size); 31 cv::line(img, p.pt, pt2, color, 1, CV_AA); 32 } 33 } 34 35 // ファイルに出力する。 36 //////////////////////////////////////////////////////// 37 std::string filename = "keypoints.csv"; 38 std::ofstream ofs(filename); 39 ofs << "x,y,angle" << std::endl; 40 for (const auto &p : keypoints) { 41 ofs << p.pt.x << "," << p.pt.y << "," << p.angle << std::endl; 42 } 43 44 cv::namedWindow("FAST Features", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO); 45 cv::imshow("FAST Features", img); 46 cv::waitKey(0); 47} 48

出力ファイル

x,y,angle 198,25,-1 198,26,-1 194,29,-1 195,29,-1 130,34,-1 170,49,-1 171,49,-1 170,50,-1 183,50,-1 183,51,-1 162,56,-1 109,74,-1 125,76,-1 126,76,-1 126,77,-1 127,77,-1 126,78,-1 127,78,-1 126,79,-1 176,79,-1 151,86,-1 116,87,-1 148,87,-1

投稿2018/10/09 08:12

tiitoi

総合スコア21956

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

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

NMN

2018/10/09 09:29

実現したいことは上記のことなのですがxcodeだとこのままではファイルに出力できないようなので、出力ファイルのライブラリを設定するにはどのようにすればいいのでしょうか?
fuzzball

2018/10/09 09:52

>>xcodeだとこのままではファイルに出力できないようなので 出力できます。出力されたファイルがどこにあるか分からないだけでしょう。 パス無しだと実行ファイルと同じフォルダに出力されているはずです。 もしくは、パスを指定して出力して下さい。
NMN

2018/10/09 09:56 編集

分かりました パスを指定してみて出力してみます 何から何までありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問