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
Matクラスのインスタンスにはちょうど画素一個分のデータが格納されるわけですが、このデータの格納方法にはいろいろ種類があります。例えば白黒画像の画素だったら濃淡の情報だけあればいいわけですから1バイトで済むのに対し、カラー画像の画素だったらR,G,Bの三つの成分を保持するため3バイト必要になる、などです。そんなわけで、atメソッドを使うときには「画素情報がどのような形式で格納されているのか」をテンプレートに入力してやる必要があります。
この格納形式はいつ決定されるのかというと、Matクラスのインスタンスを宣言した時です。つまりここです。
[code]
Mat abc(480, 640, CV_32FC3);
[/code]
CV_32FCというのは、「三つチャンネルがあり、一つのチャンネルはfloat型変数一つで表される(つまり画素一個はfloat型変数三つ分のデータを保持している)」という意味になります。ここを
[code]
abc.at<float>(200, 200)[0]
[/code]
と書いてしまうと、「この画素はfloat型変数『一つのみ』で表される」という意味になってしまいます。
[color=#7f7f7f]
より細かい話をすると、直接的なエラーの原因は
[/color]
[code]
abc.at<float>(200, 200)[0]//←この[0]の部分
[/code]
[color=#7f7f7f]
です。画素情報が変数一つ分のみで表される(つまりチャンネルが一つしか存在しない)ときにはatメソッドから帰ってくるのは配列ではなくその変数そのものなので、上のコードは配列ではないただの値を配列のようにインデックスをつけて扱っていることになります。
[/color]
よって、ここは「float型変数『三つ』で表される」と書く必要があるわけです。そのためにはこうすればよいです。
[code]
abc.at<Vec3f>(200, 200)[0]
[/code]
参考:
[url]https://minus9d.hatenablog.com/entry/20130126/1359194404[/url]
[url]http://www.wakayama-u.ac.jp/~chen/cmake/LearningOpenCV.html[/url]