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

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

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

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

C++

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

Q&A

解決済

1回答

1300閲覧

OpenCVでのcv::Mat型のデータへのアクセス方法

isol

総合スコア7

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/12/22 17:42

編集2017/12/22 17:52

###前提・実現したいこと
cv::Mat型のデータへのアクセスの仕方に困っています。

c++とOpenCVを使い画像から特徴量を抽出するプログラムを作成しました。
アルゴリズムはAKAZEを用いて行なっています。
下記のプログラムでは、読み込んだ画像をAKAZEで解析を行い、keypoint1 に特徴点を descriptor1 に特徴量を格納しています。最後に descriptor1 を出力します。

最後に出力されるデータ一つ一つにアクセスする方法をご存知の方いらっしゃいましたら、ご教授願います。
よろしくお願いします。

###該当のソースコード

c++

1#include <opencv2/core.hpp> 2#include <opencv2/features2d.hpp> 3#include <opencv2/opencv.hpp> 4 5int main(int argc, const char* argv[]) 6{ 7 std::vector<cv::KeyPoint> keypoint1; 8 cv::Mat descriptor1; 9 cv::String scene1_path = "../img1.jpg";//画像を読み込み 10 11 cv::Mat scene1 = cv::imread(scene1_path, 0); 12 13 cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create(); 14 akaze->detectAndCompute(scene1, cv::noArray(), keypoint1, descriptor1);//特徴点、特徴量抽出 15 16 std::cout << descriptor1 << std::endl;//特徴量を出力 17} 18 19

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

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

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

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

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

guest

回答1

0

ベストアンサー

一体何に使うかわかりませんが、可能ではあります。

C++

1int main(void) { 2 std::vector<cv::KeyPoint> keypoints; 3 cv::Mat descriptors; 4 5 const auto img = cv::imread( 6 R"""(C:...\Lenna.png)""" 7 ); 8 9 const auto akaze = cv::AKAZE::create(); 10 akaze->detectAndCompute( 11 img, cv::noArray(), keypoints, descriptors 12 ); 13 14 assert(descriptors.type() == CV_8U); 15 for(auto elem = descriptors.begin<unsigned char>(), 16 end = descriptors.end <unsigned char>(); elem != end; ++elem) { 17 18 std::cout << static_cast<int>(*elem) << " "; 19 } 20 std::cout << std::endl; 21 22 return 0; 23}

添え字も同時に獲得したいなら、こんな感じ。

C++

1const auto& size = descriptors.size(); 2for(int y = 0, end_y = size.height; y < end_y; ++y) { 3 for(int x = 0, end_x = size.width; x < end_x; ++x) { 4 std::cout << 5 static_cast<int>(descriptors.at<unsigned char>(y, x)) << " "; 6 } 7}

投稿2017/12/22 18:29

編集2017/12/22 21:08
LouiS0616

総合スコア35660

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

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

isol

2017/12/23 15:42

ご教授ありがとうございます。長い間つまずいていたので本当に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問