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

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

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

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

C++

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

Q&A

解決済

1回答

723閲覧

c++で特定方向の行列の最大値のindexを取得する方法

trafalbad

総合スコア303

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/10/05 02:08

編集2020/10/05 02:09

5クラスを持つ画像(224,224,5)=(H, W, depth)の行列があります。

その画像の5つの位置にアクセスして、一次元の行列を作り、その中から最も大きい値のindexを取得するしたいです。
[1, HW+1, (HW2)+1, (HW3)+1, (HW*4)+1]

自分で書いたコード

c++

1//PostProc()の中 2std::vector<float> segment; 3for (int r=0; r<height; r++) { //loop over rows 4 for (int c=0; c<width; c++) { //loop over columns 5 for (int d=0; d<depth; d++) { //loop over depth (classes) 6 segment = result[d*width*height+r*width+c]; 7 posit = max_element(segment.bigin(), segment.end()); 8 } 9 } 10}

ProstProc()のmax_element()で得たpositはクラス数=5なので、0〜4の範囲になると想定してます。

自分でコードを書いたのですが、いまいち自信がないので、教えてください。よろしくお願いします。


工程
1.CalSoftmak()でnew演算子のresultに画像を入れる
3.ProtProc()でresultの上の場所にアクセスして行列を作り、maxの値のindexを取得する

main flow

c++

1float *softmax = new float[outWidth*outHeight*outChannel]; 2float *outTensor = new float[outWidth*outHeight*outChannel]; //画像を格納しているtensor 3 4// Calculate softmax on CPU 5int outHeight=224; 6int outWidth=224; 7int outChannel=5; 8CPUCalcSoftmax(outTensor, outHeight, outWidth, outChannel, softmax)); 9 10PostProc(outHeight, outWidth, outChannel, softmax)

関数

c++

1/* Calculate softmax.*/ 2void CPUCalcSoftmax(const float *data, int height, int width, int depth, float *result) 3{ 4 assert(data && result); 5 6 float *local_res = new float [height*width*depth]; 7 for (int r=0; r<height; r++) { //loop over rows 8 for (int c=0; c<width; c++) { //loop over columns 9 double sum = 0.0f; 10 for (int d=0; d<depth; d++) { //loop over depth (classes) 11 local_res[d] = exp(data[d*width*height+r*width +c]); 12 sum=sum+local_res[d]; 13 } 14 for (int d=0; d<depth; d++) { //loop over depth (classes) 15 local_res[d] = local_res[d]/sum; 16 result[d*width*height+r*width+c] = local_res[d]; 17 } 18 } 19 } 20 cout << "output file name : in CPUsoftmax = " << OUTPUT_DIR + output_filenames << endl; 21 delete[] local_res; 22} 23 24// post process 25void PostProc(int height, int width, int depth, float *result){ 26 assert(result); 27 28 std::vector<float> segment; 29 for (int r=0; r<height; r++) { //loop over rows 30 for (int c=0; c<width; c++) { //loop over columns 31 for (int d=0; d<depth; d++) { //loop over depth (classes) 32 segment = result[d*width*height+r*width+c]; 33 posit = max_element(segment.bigin(), segment.end()); 34    // positは0~4のはず 35 cout << "max value index" << posit << endl; 36}

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

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

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

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

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

yuki23

2020/10/05 06:50

質問は何でしょうか?
trafalbad

2020/10/05 06:56

postproc()の中でresultの中身を5つ格納しています。 質問 ・格納するのはvector<float>segmentであってますか? ・取得した後のsegmentのベクトルの中から最大値を取得し、その最大値のindexを取得したいです よろしくお願いします
fana

2020/10/05 08:57

これってコンパイル通るんですか? ・通る場合 → じゃあ実際に動かしてみれば妥当か否かはわかるよね? 一体何を訊いている? ・通らない場合 → 自身があるとか無いとか言うのは一体何の話?
trafalbad

2020/10/06 10:31

なにわけわかんないこといってんだお前
fana

2020/10/06 11:40

(ひょっとして「コンパイル通る自信がないです」とかいう話だったのか.)
guest

回答1

0

自己解決

void PostProc(const float result, int height, int width, int depth){
assert(result);
Mat segMat(height, width, CV_8UC3);
for (int r=0; r<height; r++) { //loop over rows
for (int c=0; c<width; c++) { //loop over columns
float pix_val[CLS];
for (int d=0; d<depth; d++) { //loop over depth (classes)
int i = d
widthheight+rwidth+c;
pix_val[d]= result[i];
}
auto max_ind = max_element(pix_val, pix_val + CLS);
int posit = distance(pix_val, max_ind);
segMat.at<Vec3b>(r, c) = Vec3b(colorB[posit], colorG[posit], colorR[posit]);
}
}
cv::imwrite(OUTPUT_DIR + output_filenames, segMat);
}

投稿2020/10/06 10:31

trafalbad

総合スコア303

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問