カメラからとったカラー画像が濃淡画像でうまく出力できません。
どなたか教えてください。よろしくお願いします。
// 濃淡画像に変換
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;
}
うまく出力できません、というのは
・コンパイル時にエラーが出る
・実行時にエラーが出る
・画像が期待通りにならない
のどれでしょうか?
(unsigned char)でキャストする場所がまずいのでは?
・コンパイル時にエラーが出る
・実行時にエラーが出る
・画像が期待通りにならない
うまく出力できないというのは、カラー画像のまま出力されてしまうのです。
エラーはでません。
最終的には、キャプチャーしたカラー画像を2値化したいのですが・・。
カラー画像のまま出力されてしまうのです。
pixelDataのデータをgrayDataに移した(写した?)あとに、
(つまり上のコードのあとに)
grayDataを使わずに捨てているとかないですか?
一番上のコードのあとに下がきます。
::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;
// 画像のバイナリデータからDIBデータを作成
SetDIBits (hDC, hBitmap, 0, lpBMInfo->bmiHeader.biHeight,
pixelData, lpBMInfo, DIB_RGB_COLORS);
^^^^^^^^^
↑ここじゃないかな??
なりました!ありがとうございます!!
この濃淡画像を2値化するのは、濃淡画像の下にその処理のプログラムを書けばいいのでしょう
か?
「濃淡画像に変換」のところで、pixelDataからRGB値を持ってきて
一定の割合で混ぜ合わせてgrayLevelという値を作っているけれども、
ここである「しきい値」によってgrayLevelを1にしたり0にしたりする
処理をはさんでから、grayDataに値を移せばいいのでは。
それは、例えば「t」という閾値をつくって、一定の割合で混ぜ合わせる前に1や0にするので
しょうか?
いや混ぜ合わせた直後に、でしょう。
すみません・・よくわからないのですが。もう少し簡単に・・。初心者なもので。
unsigned char t = 127;//例
・・・
grayLevel = (混ぜ合わせ);
if ( grayLevel < t )
grayLevel = 0;
else
grayLevel = 1;
(grayDataへのデータ書き込み);
やってみました!
エラーは無いのですが、真っ黒になってしまいました。
書き込みがいけないのでしょうか?