攝像頭的影像顯示在Panel1上,想截獲每幀顯示到Panel2上,但
影像位深(BitmapInfo.bmiHeader.biBitCount) 為16時, 顯示的影像色彩斑斕, 為8的時候也顯示,但更失真, 當為24時,不顯示, 請幫忙解答一下,影像為啥24位時怎么才能顯示
代碼如下:
LRESULT PASCAL FrameCallbackProc(HWND CapWnd,LPVIDEOHDR lpVHDR)
{
int nHeight=Capstatus.uiImageHeight;
int nWidth=Capstatus.uiImageWidth ;
BITMAPINFO BitmapInfo;
ZeroMemory( &BitmapInfo, sizeof( BitmapInfo ) );
BitmapInfo.bmiHeader.biSize = sizeof( BitmapInfo.bmiHeader );
BitmapInfo.bmiHeader.biWidth = nWidth ; // 影像寬度
BitmapInfo.bmiHeader.biHeight = -nHeight; // 影像高度
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = 16; // 影像位深
HDC hdc = GetDC(Form1->Panel2-> Handle);
SetStretchBltMode(hdc, COLORONCOLOR);
StretchDIBits(
hdc,
0, 0,nWidth, nHeight,
0, 0, nWidth, nHeight,
lpVHDR->lpData,
&BitmapInfo,
0, SRCCOPY);
return NULL;
}
uj5u.com熱心網友回復:
把這句:SetStretchBltMode(hdc, COLORONCOLOR);
改成:
SetStretchBltMode(hdc, HALFTONE); 試試
uj5u.com熱心網友回復:
謝謝回復, 不過,這樣修改后還是老樣子
uj5u.com熱心網友回復:
是不是 lpVHDR->lpData 里放的是YUV格式的資料uj5u.com熱心網友回復:
這個不好說,你可以估算一下影像的顏色位數,k= lpVHDR->dwBytesUsed / Width /Height
如果k是1就是8位色 ,應該是8位灰度的吧
是2是16位表示 ,是YUV還是16位色我不確定
是3是24位色 ,這個基本是RGB的
先搞清顏色位數。
這個函式好像可以獲取影像格式,你試試:capGetVideoFormat()
uj5u.com熱心網友回復:
capGetVideoFormat 取的是16位. 不是YUV的資料因為panel1顯示正常,是32位的.
uj5u.com熱心網友回復:
k= lpVHDR->dwBytesUsed / Width /Height算出來的是多少?
uj5u.com熱心網友回復:
你的攝像頭支持capSetVideoFormat設定自己的格式嗎?如果是16位,多半是YUV的。是YUV的需要你再開辟一個快取區,轉換成RGB顯示。
uj5u.com熱心網友回復:
使用capSetVideoFormat設定為RGB24或YUYV色,這樣顏色格式更明確些。如果能設為RGB24以后處理方面點,但很多USB攝像頭為了提高速度不支持這種格式,大多為YUYV格式。uj5u.com熱心網友回復:
是 2
uj5u.com熱心網友回復:
大概是YUYV格式的了。這個用GDI顯示需要轉換才可以。YUYV用4個位元組表示兩個像素的YUV分量。 其中兩個Y表示兩個像素的亮度分量,UV分量為兩個像素共用,
把YUYV組合成兩個YUV顏色,再轉換成兩個RGB,然后顯示。
我找了個轉換公式:
B = Y + 2.032*U
R = Y + 1.140*V
G = Y - 0.3946*U - 0.589*V
轉換可能會影響顯示的速度,需要優化算發,比如查表。
uj5u.com熱心網友回復:
能具體點么 ?還是不知道怎么改 我也是這個問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137487.html
下一篇:為什么會出現圖中的情況
