カメラからのカラー画像を濃淡画像へ – プログラミング – Home

カメラからのカラー画像を濃淡画像へ
 
通知
すべてクリア

[解決済] カメラからのカラー画像を濃淡画像へ

固定ページ 1 / 2

はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

カメラからとったカラー画像が濃淡画像でうまく出力できません。
どなたか教えてください。よろしくお願いします。
// 濃淡画像に変換
int i, j;
unsigned char grayLevel;

grayFlag = 1;
grayData = (unsigned char *)malloc(sizeof(unsigned
char) * size);
for (j=0; j<h; j++) {
for (i=0; i<(w*3); i+=3) {
// pixelDataの色は,BGRの順
grayLevel = (unsigned char)(0.299
* *(pixelData + j*(w*3) + i+2)

+ 0.587 * *(pixelData + j*(w*3) + i+1)

+ 0.114 * *(pixelData + j*(w*3) + i));
*(grayData + j*(w*3) + i) = *
(grayData + j*(w*3) + i+1)
= *(grayData +
j*(w*3) + i+2) = grayLevel;
}


引用未解決
トピックタグ
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

うまく出力できません、というのは

・コンパイル時にエラーが出る
・実行時にエラーが出る
・画像が期待通りにならない

のどれでしょうか?


返信引用
あきら
 あきら
(@あきら)
ゲスト
結合: 23年前
投稿: 49
 

(unsigned char)でキャストする場所がまずいのでは?


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

・コンパイル時にエラーが出る
・実行時にエラーが出る
・画像が期待通りにならない

うまく出力できないというのは、カラー画像のまま出力されてしまうのです。
エラーはでません。


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

最終的には、キャプチャーしたカラー画像を2値化したいのですが・・。
カラー画像のまま出力されてしまうのです。


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

pixelDataのデータをgrayDataに移した(写した?)あとに、
(つまり上のコードのあとに)
grayDataを使わずに捨てているとかないですか?


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

一番上のコードのあとに下がきます。
::BeginPaint (m_hWnd, &ps); // 描画開始

// ビットマップハンドルの作成
hBitmap = CreateDIBitmap(hDC, &lpBMInfo->bmiHeader,
0, NULL, NULL, DIB_RGB_COLORS);

// ビットマップを指定
::SelectObject (hCompatiDC, hBitmap);

// 画像のバイナリデータからDIBデータを作成
SetDIBits (hDC, hBitmap, 0, lpBMInfo-
>bmiHeader.biHeight, pixelData,

lpBMInfo,
DIB_RGB_COLORS);
// hCompatiDCのデータをhDCへコピーして表示
BitBlt (hDC, 0, 0, lpBMInfo->bmiHeader.biWidth,

lpBMInfo->bmiHeader.biHeight, hCompatiDC, 0, 0, SRCCOPY);

::EndPaint (m_hWnd, &ps); // 描画終了

// メモリ削除
::DeleteObject (hBitmap);
::DeleteObject (hCompatiDC);
::ReleaseDC (m_hWnd, hDC);
free (pixelData);
if (grayFlag)
free (grayData);

if (DEBUG_Flag) {
sprintf (msg, W=%d, H=%d, capFlag=%d, 0,
0, capFlag);
AfxMessageBox (msg, MB_OK, 0);

sprintf (msg, W=%d, H=%d, capFlag=%d,
lpBMInfo->bmiHeader.biWidth, lpBMInfo->bmiHeader.biHeight, capFlag);
AfxMessageBox (msg, MB_OK, 0);
}
}
そして、BMInfoはこうなっています。 *pbmi = (BITMAPINFO*)new BYTE[sizeof
(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];
ZeroMemory(&(*pbmi)->bmiHeader, sizeof((*pbmi)->bmiHeader));
(*pbmi)->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
(*pbmi)->bmiHeader.biWidth = Width;
(*pbmi)->bmiHeader.biHeight = Height;
(*pbmi)->bmiHeader.biBitCount = 24; // Full Color
(*pbmi)->bmiHeader.biPlanes = 1;
(*pbmi)->bmiHeader.biSizeImage =
((((*pbmi)->bmiHeader.biWidth
* (*pbmi)->bmiHeader.biBitCount+31)>>3)
//ビット→バイト。
& 0xfffffffc)
//4バイト境界。
* (*pbmi)-
>bmiHeader.biHeight;


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

// 画像のバイナリデータからDIBデータを作成
SetDIBits (hDC, hBitmap, 0, lpBMInfo->bmiHeader.biHeight,
pixelData, lpBMInfo, DIB_RGB_COLORS);
^^^^^^^^^
  ↑ここじゃないかな??


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

なりました!ありがとうございます!!
この濃淡画像を2値化するのは、濃淡画像の下にその処理のプログラムを書けばいいのでしょう
か?


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

「濃淡画像に変換」のところで、pixelDataからRGB値を持ってきて
一定の割合で混ぜ合わせてgrayLevelという値を作っているけれども、

ここである「しきい値」によってgrayLevelを1にしたり0にしたりする
処理をはさんでから、grayDataに値を移せばいいのでは。


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

それは、例えば「t」という閾値をつくって、一定の割合で混ぜ合わせる前に1や0にするので
しょうか?


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

いや混ぜ合わせた直後に、でしょう。


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

すみません・・よくわからないのですが。もう少し簡単に・・。初心者なもので。


返信引用
n
 n
(@n)
ゲスト
結合: 21年前
投稿: 90
 

unsigned char t = 127;//例

・・・

grayLevel = (混ぜ合わせ);

if ( grayLevel < t )
grayLevel = 0;
else
grayLevel = 1;

(grayDataへのデータ書き込み);


返信引用
はち
 はち
(@はち)
ゲスト
結合: 22年前
投稿: 27
Topic starter  

やってみました!
エラーは無いのですが、真っ黒になってしまいました。
書き込みがいけないのでしょうか?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました