スポンサーサイト

上記の広告は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

Re: No title

あまり詳しくないのですが、1画素 32bitx4 として扱っているのであれば、fprintf() の中で unsigned char にキャストしなおす必要はないと思われます。
つまり、(float)(unsigned char)pBuf[...] の部分は pBuf[...] とするのが良いと思われます。

また、正常に動作しない理由ですが、widthStep の掛け算に問題がありそうです。
widthStep はバイト数で値を保持しているらしいので、ポインタ演算対象が float である今回は x * 4 + y * parallax->widthStep / 4 という様に演算対象の型のバイト数で割ってやる必要があると予想されます。

実際に動かした訳ではないので、これで直らなかったらすいません。

No title

このページを参考に画像の各画素にアクセスしその輝度値をテキストで保存するプログラムを書いております。そこで、質問なのですが、浮動小数点型32bitの画像をテキストに保存する場合。ポインタ部分もcharの方がよいのでしょうか?それともfloatへのポインタとして指定するのでしょうか?以下のようなプログラムを書いているんですが正しく実行されません。(abortされます)ファイルの開閉や画像の生成等プログラムのほかの必要な部分は省略しています

float *pBuf = (float *)parallax->imageData;//最初の画素のポインタを得る

for (int y = 0; y < parallax->height; y++){
for (int x = 0; x < parallax->width; x++){
fprintf(file2, "%d %d %f\n", y, x, (float)(unsigned char)pBuf[x * 4 + y * parallax->widthStep]);//depthは IPL_DEPTH_32F
}
}
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。