アプリ版:「スタンプのみでお礼する」機能のリリースについて

opencvに関する質問です。
64×64画像の画素値をMat行列に格納し、
その行列をvectorに変換するプログラムなのですが、
その変換の部分でうまくいきません。原因はなんでしょうか。

よろしくお願いいたします。


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<vector>
#include <stdlib.h>
using namespace cv;
using namespace std;

int main(int argc, char *)
{
vector <float> v1;
Mat A = imread( "分割1-1\0015.bmp",);//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換
A.copyTo(v1);//Aをベクトルv1に変換
waitKey(0);
return 0;
}

A 回答 (4件)

atメソッドを使ったり、ptrメソッドを使ったりします。


http://opencv.jp/opencv2-x-samples/access_pixel_ …
の C++版 。これは、各画素の書き込むものですが、= の左右を逆に考えれば、各画素の値を読み出すのに使えます。



追記:
調べたところ、 cv::Mat::copyToで、std::vectorにコピーすること自体はできるようです。
http://book.mynavi.jp/support/pc/opencv2/c3/open …
ただ、その場合、Matの型、チェンネルとvectorの型を揃える必要があるように思います。
また、OpenCVのバージョンによっては、 型を指定する必要があります。

それで気になっているんですが、
おそらく、 〜.bmpは、 8bit x 3チャンネル(3色) です。
それに対して、 v1は <float> となっています。
v1には、どんなデータを入れたいとお考えなのでしょうか?

事前に型や色を変換するとか、vectorを適切な型にするとかが必要と思われます。
# 今OpenCVを使える環境が無いので、当方で確認することはできません
    • good
    • 1
この回答へのお礼

ありがとうございます。
v1には、bmpの画素値が入ったMatをコピーしたいと考えています。
ちなみに、bmpは64×64のグレー画像です。
この画像の画素値をまずMatに格納し、それをv1にコピーしたいと考えています。
型についての知識がないため、迷惑をかけるかもしれませんが、
よろしくお願いいたします。

お礼日時:2015/12/05 23:32

エラーメッセージ読んでもわかりませんか?



#1のコードは
vector< vector > &dst

あなたのコードは
vector <float> v1


難しいようなら、まとめてやろうとは思わず、
Aから1個選択→ v1にpush_back を全データについて繰り返す
って、単純なプログラムにしてはどうです?
    • good
    • 0
この回答へのお礼

ありがとうございます。
そのプログラムを作成してみます。
Aから1個選択とは、どのような操作でしょうか?

お礼日時:2015/12/05 11:21

https://oshiete.goo.ne.jp/qa/9124133.html
の繰り返しになりますけど、
** 「うまくいかない」とは、具体的にどんな現象から判断していますか? **

そもそも、コンパイル自体が成功しない。
画像の読み込み が「うまくいかない」
画像は読み込めたけど、 1行の行列へ変換が「うまくいかない」
画像は読み込めたし、1列の行列の変換するのもできたけど、 vectorに変換するのが「うまくいかない」


それぞれで対策が違います。
正常動作している部分がわからなければ、せっかく正しいのに逆に間違えてしまうこともあります。




Mat A = imread( "分割1-1\0015.bmp",)
 ・目に見えておかしいのが文字列リテラル(文字列の定数)
  \ が特別扱いになるのはご存知ですよね?
 ・"のあとの . ) って、文法エラーになりませんか? カンマだけで引数省略、なんて書き方、C++ではできないはずです。
 ・ファイルを正しく読めていることを確認してください。
  ファイル操作は失敗が多いです(USBディスクを指定したけど抜いた後だった、とか)
http://opencv.jp/opencv-2svn/cpp/reading_and_wri …


A= A.reshape(0,1);//Aを1行の行列へ変換
 マニュアルによると「チャンネル(カラーとかグレースケールとか) を変えずに1行に変形」 ということになりますが、それで正しいですか?

A.copyTo(v1);//Aをベクトルv1に変換
 マニュアルを読む限りでは、 cv::Matからcv::Matへコピーするもので、 std::vectorにコピーするようには見えないのですが。
 別のバージョンではstd::vectorへコピーするようになったのでしょうか?
 http://opencv.jp/opencv-2svn/cpp/core_basic_stru …
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみたところ、for文の中でエラーが起きるのですが、どんな原因なんでしょうか。

vector <float>v1;
Mat A = imread(”分割1-1\¥0015.bmp”);//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換


for (int i = 0; i&lt; image.rows; i++)
{
v1.push_back(image.row(i));//ここでv2.push_backはできないというエラーが出ます
}

お礼日時:2015/12/05 10:48

copyToメソッドは


void Mat::copyTo(Mat& m )
なので、vectorに変換することができません。

vectorに変換するためには以下のように逐次追加する必要があります(URL先から引用)
void MatToVec(const Mat &src, vector< vector > &dst){
for(int i = 0; i< src.rows; i++ ){
dst.push_back(src.row(i));
}}

引用元
http://utunes.blog.fc2.com/blog-entry-10.html
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみたところ、for文の中でエラーが起きるのですが、どんな原因なんでしょうか。

vector <float> v1;
Mat A = imread( "分割1-1\¥0015.bmp");//Aに画像を読み込み
A= A.reshape(0,1);//Aを1行の行列へ変換


for (int i = 0; i< image.rows; i++)
{
v2.push_back(image.row(i));//ここでv2.push_backはできないというエラーが出ます
}

お礼日時:2015/12/05 10:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています