opencvのmatへのアクセスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ttb
記事: 17
登録日時: 8年前
住所: 東京都

opencvのmatへのアクセスについて

#1

投稿記事 by ttb » 6年前

開発環境
OS windows10
visual studio 2017 c++
opencv3.4.1

float型のmatのある座標へ値を代入したいのですが,構文エラーでデバックできません.
コードのどこが間違っているのか,教えて頂きたいです.
宜しくお願いします.

コード:

Mat abc(480, 640, CV_32FC3);
abc.at<float>(200, 200)[0] = atan2(1.00, -1.00);

Rei

Re: opencvのmatへのアクセスについて

#2

投稿記事 by Rei » 6年前

Matクラスのインスタンスにはちょうど画素一個分のデータが格納されるわけですが、このデータの格納方法にはいろいろ種類があります。例えば白黒画像の画素だったら濃淡の情報だけあればいいわけですから1バイトで済むのに対し、カラー画像の画素だったらR,G,Bの三つの成分を保持するため3バイト必要になる、などです。そんなわけで、atメソッドを使うときには「画素情報がどのような形式で格納されているのか」をテンプレートに入力してやる必要があります。
この格納形式はいつ決定されるのかというと、Matクラスのインスタンスを宣言した時です。つまりここです。

コード:

Mat abc(480, 640, CV_32FC3);
CV_32FCというのは、「三つチャンネルがあり、一つのチャンネルはfloat型変数一つで表される(つまり画素一個はfloat型変数三つ分のデータを保持している)」という意味になります。ここを

コード:

abc.at<float>(200, 200)[0]
と書いてしまうと、「この画素はfloat型変数『一つのみ』で表される」という意味になってしまいます。

より細かい話をすると、直接的なエラーの原因は

コード:

abc.at<float>(200, 200)[0]//←この[0]の部分

です。画素情報が変数一つ分のみで表される(つまりチャンネルが一つしか存在しない)ときにはatメソッドから帰ってくるのは配列ではなくその変数そのものなので、上のコードは配列ではないただの値を配列のようにインデックスをつけて扱っていることになります。

よって、ここは「float型変数『三つ』で表される」と書く必要があるわけです。そのためにはこうすればよいです。

コード:

abc.at<Vec3f>(200, 200)[0]
参考:
https://minus9d.hatenablog.com/entry/20 ... 1359194404
http://www.wakayama-u.ac.jp/~chen/cmake ... penCV.html

ttb
記事: 17
登録日時: 8年前
住所: 東京都

Re: opencvのmatへのアクセスについて

#3

投稿記事 by ttb » 6年前

ご指摘の箇所を修正したところ問題なくデバック出来ました.
説明がとても分かりやすく,すんなりと納得することが出来ました.
有難うございます.

返信

“C言語何でも質問掲示板” へ戻る