現在USBカメラのカメラデータを取得するソフトを作成しています。
取得したデータは後に画像処理した上で出力します。
カメラからうまく画像データが取得できません。
取得したデータを出力してみると以下のアドレスのような画像になってしまいます。
取得したカメラから取得したデータは中でどのような並びになっているのでしょうか?
ちなみに画像サイズは横320x縦240です。
以下が主要な所を抜粋したコードです。
ご指導お願いします。
開発環境VC++2005
int CameraNumber = 1;
// 初期化
GetDlgItem(IDC_PIC1,&hPic[CameraNumber]);
m_pCamera[CameraNumber ] = new CCamera(CameraNumber);
m_pCamera[CameraNumber ]->InitGraphs(&hPic[CameraNumber]);
// 取得画像データ情報
int iSize = m_pCamera[CameraNumber]->GetBufferSize();
int iWidth = m_pCamera[CameraNumber]->GetImageWidth();
int iHeight = m_pCamera[CameraNumber]->GetImageHeight();
// 画像データ取得
unsigned char* m_pSnapImage = new unsigned char[iSize];
m_pCamera[CameraNumber]->GetCurrentImage(m_pSnapImage);
// 取得した画像データを出力
int Num = 0;
int Ynum = 0;
int Xnum = 0;
for(int Num = 1; Num <= iSize; Num++){
// X位置カウント
Xnum++;
// X端っこで折り返し
if( Xnum == 321 ){
// Y位置を上げる
Ynum++;
// X位置初期化
Xnum = 1;
}
// 色情報を取得(Y軸で反転している?)
m_dcBuffer.SetPixel(Xnum,240-Ynum,RGB(m_pSnapImage[Num+2],
m_pSnapImage[Num+1],
m_pSnapImage[Num+0]));
// アドレスを進める
Num +=3;
}
// 出力
pdc->BitBlt( 1,1,320,240, &m_dcBuffer, 1, 1, SRCCOPY);
勘!
:
:
:
// 取得した画像データを出力
int Ynum,Xnum;
for(Ynum = 0; Ynum < 240; Ynum++) {
for(Xnum = 0; Xnum < 320; Xnum++) {
int Num;
Num = (Ynum * 320 + Xnum) * 4;
m_dcBuffer.SetPixel(
Xnum, Ynum,
RGB(m_pSnapImage[Num + 2],
m_pSnapImage[Num + 1],
m_pSnapImage[Num + 0])
);
}
}
:
:
:
どっちで勘違いしてるのかわからないが
1:
入力が32ビットカラーではなく24ビットカラーだった
2:
>for(int Num = 1; Num <= iSize; Num++){
ここで1進めてるから
のどっちかではないかな
元のソースを見ると。。。
for(int Num = 1; Num <= iSize; Num++){
:
(中略)
:
// アドレスを進める
Num +=3;
}
とあるので、
Num+=3;
を行った後にfor文の中のNum++が実行されるからでしょうね。
さて。。
m_pSnapImageの中身はプログラムを見る限り、
B,G,Rの色要素しかないのですか?
本当にこの順番で意図した色要素が入っているか、
確認して下さい。
# RGBの要素しかないのであれば、自分が提示したソースの
# Num = (Ynum * 320 + Xnum) * 3;
# と修正すると良いのかな(但しY軸で反転しているのかは知らないけれど)。
追加質問になりますが。。。
どうして、Numが1から開始されているのでしょうか?
そういう仕様なのですか?
...さんのご指摘通り
> どうして、Numが1から開始されているのでしょうか?
> for(int Num = 1; ....
が原因でした。
ありがとうございました。
すみません。
解決です。