スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

OpenCVで画素を直接扱う際に気をつけること

2011/12/04更新

OpenCVで画像を扱っているIplImage構造体から、各画素へアクセスするには、

/* グレースケールの場合 */
IplImage *src = cvLoadImage(fname, CV_LOAD_IMAGE_GRAYSCALE);

for(int y=0;y < src->height;y++){
for(int x=0;x < src->width;x++)
{
cout << (unsigned char)src->imageData[src->widthStep * y + x] << endl;
}
}

/* カラーの場合(汎用。 グレースケールでも使えます) */
IplImage *src = cvLoadImage(fname, CV_LOAD_IMAGE_COLOR);

for(int y=0;y < src->height;y++){
for(int x=0;x < src->width;x++){
for(int c=0;c < src->nChannels;c++)
{
cout << (unsigned char)src->imageData[src->widthStep * y + x*src->nChannels + c] << endl;
}
}
}


の様にすれば良いわけですが、この際気を付けなければならないのは、imageDataが保持している値。

各画素の値は0〜255ですが、imageData[]の戻り値はcharとなっています。
つまり、imageData[]の値をそのまま、intやdoubleにキャストすると-127〜128と扱われてしまいます。

これを防ぐには、(unsigned char)src->imageData[src->widthStep * y + x]のように、一度unsigned charでキャストしてやればいいようです。

int型にしたいときは、(int)(unsigned char)src->imageData[src->widthStep * y + x]とすれば、ちゃんと0〜255として扱われました。
少し無駄がある気もしますが、とりあえずこれで上手く動いているので、ひとまず良しとしました。
他のやり方を知っている方がいらっしゃいましたら教えてくださると助かります。

ちなみに、直接unsigned intでキャストすると値が大変な事になりますので、お気を付けください。
関連記事

comment

Secret

プロフィール

シロマ=ナノ

Author:シロマ=ナノ
参加予定イベント:
 ・C91 3日目西め28a

DIVA-AC:
 LV.199 白のシンフォニア

Flashカレンダー
Twitter
カテゴリ
最新記事
PCLクレジット
当ブログは、ピアプロ・キャラクター・ライセンス(http://piapro.jp/license/pcl)に基づいて、クリプトン・フューチャー・メディア株式会社のキャラクター 「初音ミク」「鏡音リン」「鏡音レン」「巡音ルカ」「Meiko」「Kaito」及びそれらに依拠して制作されたキャラクター「亞北ネル」「弱音ハク」を描いた作品を公開しています。
アクセスカウンター
検索フォーム
主な作品
WindowHelper(フリーソフト)
WindowHelperポップ

描いた絵・イラスト
リンク
バナー
当サイトはリンクフリーです。
バナーを使用したい場合は以下の画像をお使い下さい。
(リンク先に200x40サイズを置いてあります)

・通常版
banner

・ミク版
banner
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。