カメラからのカラー画像を濃淡画像へ

[戻る]
はち 2004/01/31(土) 13:14:27
カメラからとったカラー画像が濃淡画像でうまく出力できません。
どなたか教えてください。よろしくお願いします。
// 濃淡画像に変換
            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 2004/01/31(土) 15:29:26
うまく出力できません、というのは

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

のどれでしょうか?

あきら 2004/01/31(土) 15:37:20
(unsigned char)でキャストする場所がまずいのでは?

はち 2004/01/31(土) 15:41:12
・コンパイル時にエラーが出る
・実行時にエラーが出る
・画像が期待通りにならない

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

はち 2004/01/31(土) 15:44:53
最終的には、キャプチャーしたカラー画像を2値化したいのですが・・。
カラー画像のまま出力されてしまうのです。

n 2004/01/31(土) 15:50:08
pixelDataのデータをgrayDataに移した(写した?)あとに、
(つまり上のコードのあとに)
grayDataを使わずに捨てているとかないですか?

はち 2004/01/31(土) 15:56:10
一番上のコードのあとに下がきます。
    ::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 2004/01/31(土) 16:07:55
// 画像のバイナリデータからDIBデータを作成
SetDIBits (hDC, hBitmap, 0, lpBMInfo->bmiHeader.biHeight,
 pixelData, lpBMInfo, DIB_RGB_COLORS);
 ^^^^^^^^^
  ↑ここじゃないかな??

はち 2004/01/31(土) 16:14:40
なりました!ありがとうございます!!
この濃淡画像を2値化するのは、濃淡画像の下にその処理のプログラムを書けばいいのでしょう
か?

n 2004/01/31(土) 16:27:03
「濃淡画像に変換」のところで、pixelDataからRGB値を持ってきて
一定の割合で混ぜ合わせてgrayLevelという値を作っているけれども、

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

はち 2004/01/31(土) 16:37:31
それは、例えば「t」という閾値をつくって、一定の割合で混ぜ合わせる前に1や0にするので
しょうか?

n 2004/01/31(土) 16:40:14
いや混ぜ合わせた直後に、でしょう。

はち 2004/01/31(土) 17:03:58
すみません・・よくわからないのですが。もう少し簡単に・・。初心者なもので。

n 2004/01/31(土) 17:10:46
unsigned char t = 127;//例

・・・

grayLevel = (混ぜ合わせ);

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

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

はち 2004/01/31(土) 17:34:29
やってみました!
エラーは無いのですが、真っ黒になってしまいました。
書き込みがいけないのでしょうか?

n 2004/01/31(土) 17:37:04
tをもっと小さい値にしてみるとか。

はち 2004/01/31(土) 17:45:28
tを100にしたらグレーの濃淡画像みたいになってしまいました??

n 2004/01/31(土) 17:49:22
しまった・・・ボケかました。

if ( grayLevel < t )
 grayLevel = 0;
else
 grayLevel = 255;
             ^^^
こうして下さい。

はち 2004/01/31(土) 17:53:03
なおしてみました。
でもかわりません・・。
grayDateへの書き込みはなんてかくのですか?

n 2004/01/31(土) 17:55:49
grayDateへの書き込みは最初のコードのままでいいはずですが。

はち 2004/01/31(土) 18:00:21
[[解決]]
できました!!!!!!!
ありがとうございます!!!
またなにかわからないことがありましたらよろしくお願いします!
本当にありがとうございます!

古いスレッドには追加発言できません。