關於ccd改變解析度顯示的問題 |
尚未結案
|
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
各位大大
我本來解析度設在320*240於image上顯示時都ok沒問題~我是使用以下這個方法
但是我改成640*480時就出現出錯了~不知是那裡錯請各位大大幫幫我
這是它的錯誤訊息我把圖片放上來~它是在memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3);這一行出現反藍的不知是不是這邊錯
可是在320*240時放到image上顯示都沒問題的
#define ImageWidth 640
#define ImageHeight 480
HWND hCapWnd;
LRESULT CALLBACK FrameCallBack( HWND, Longint);
LPVIDEOHDR VideoStr;
unsigned char *CcdBuffer=new unsigned char[ImageWidth*ImageHeight*3];
TForm1 *Form1;
//-------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------------------
class PasteIm
{
private:
Byte *ptr2;
int x,y;
public:
Graphics::TBitmap *pBitmap1;
unsigned char *ImPasteBuf;
PasteIm()
{
pBitmap1=new Graphics::TBitmap;
ImPasteBuf=new unsigned char[ImageWidth*ImageHeight*3];
}
void PasteMake(TImage *imag)
{
pBitmap1= imag->Picture->Bitmap ;
for ( y = 0; y < ImageHeight; y++)
{
ptr2 = (Byte *)pBitmap1->ScanLine[y];
for ( x = 0; x < ImageWidth; x++)
{
ptr2[x*3]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3)];
ptr2[x*3+1]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3+1)];
ptr2[x*3+2]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3+2)];
}
}
imag->Picture->Assign(pBitmap1);
}
};
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, ImageWidth, ImageHeight,ImProcess->Panel1->Handle, 0 );
hCapWnd = capCreateCaptureWindow("Capture Window", WS_CHILD | WS_VISIBLE, 0, 0, 1, 1, Panel1->Handle, 0);
bool a = false;
for( int i = 0; i < 10; i++ )
{
a = capDriverConnect( hCapWnd, i );
if( a ) break;
}
if( !a )
{
ShowMessage("攝影機連接失敗..");
}
capOverlay(hCapWnd, true);
capPreview(hCapWnd,true);
capPreviewScale(hCapWnd,true);
capPreviewRate(hCapWnd, 1000/30);
Timer1->Enabled =true;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//-------------------------------------------------------------------
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )
{
VideoStr=LPVIDEOHDR(lpvhdr);
memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3);
capSetCallbackOnFrame (hCapWnd, NULL); //停止callbackonframe
return(0);
}
//-----------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
capSetCallbackOnFrame (hCapWnd, &FrameCallBack);
PasteIm k2;
memcpy(k2.ImPasteBuf ,CcdBuffer,ImageWidth*ImageHeight*3);
k2.PasteMake(Image1) ;
}
//-------------------------------------------------------------------
|
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
我的CCD是支源到640*480的ㄚ~我先將ccd影像直接顯示在panel這個元件上是ok的~640*480可以顯示出來~但是我再去記憶體抓完放到image元件上就出現以上我說的錯誤了
而320*240就能在image上顯示~所以我不知到底是那有問題~希望大大能幫我找找那錯了
而我覺得是下面這段有問題但是我找不出是那錯希望各位大大能幫忙
//程式設定回傳的函式
capSetCallbackOnFrame (hCapWnd, &FrameCallBack); //某個函式把lpvhdr傳過來
LRESULT CALLBACK FrameCallBack( HWND hwnd, longint lpvhdr )
{
VideoStr=LPVIDEOHDR(lpvhdr);
//當它傳給我資料
//我要copy時出了錯,它的記憶體指標或者指標所指的資料造成存取違反
memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3); capSetCallbackOnFrame (hCapWnd, NULL);
return(0);
}
拜託各位大大幫幫我~已經好幾天了我都找不出來~
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
首先您必須確認 目前的視訊來源的影像長寬尺寸
你可以使用
capGetVideoFormatSize 及 capGetVideoFormat
來取得 視訊來源的影像格式 如下範例:
Boolean GetBitmapInfo(PBitmapInfo pbi) { DWORD s; Boolean Result ; Result=False; s= capGetVideoFormatSize(hCapWnd); if (s!=0) { // getmem(pbi,s); pbi=(PBitmapInfo) new char[s]; if (capGetVideoFormat(hCapWnd,pbi,s)==s) Result=True; } if (Result==False) ShowMessage("Get Vido Format fail ?"); return Result; } LRESULT OnFrameCallBack( HWND caphwnd,int lpvhdr ) { LPVIDEOHDR VideoStr=LPVIDEOHDR(lpvhdr); PBitmapInfo pbi; if ( GetBitmapInfo(pbi)==False ) return(0); tagBITMAPINFO bi=*pbi; if ( (bi.bmiHeader.biWidth==640) && // 判斷 影像寬度是否為 640 (bi.bmiHeader.biHeight==480) && // 判斷 影像寬度是否為 480 (bi.bmiHeader.biBitCount==24) // 判斷 影像色彩是否為 24 bit ) { memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3); } else { // 請重新設定 視訊來源的影像格式 } delete pbi; capSetCallbackOnFrame (hCapWnd, NULL); return(0); } -------------------------------------- See Also 第十一章 視訊回呼函式應用http://netbook.mm520.net
------
︿︿ |
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
可是我的影像寬跟高一開始就寫死了ㄚ我想這樣
#define ImageWidth 640
#define ImageHeight 480 所以視訊應該就是640*480了~且我在panel上能顯示出640*480的影像
只是我再重記藝體把它搬到image上顯示時就錯誤了~所以想請教大大我是那錯了~不過我寫成這樣時
#define ImageWidth 320
#define ImageHeight 240
在panel上能顯示出320*240且搬到image上也能顯示出320*240
而我們ccd也確定支源到640*480~應該在panel上能顯示出640*480
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
我只能說
請確認 您的視訊來源的影像長寬尺寸 您所說的
#define ImageWidth 640
#define ImageHeight 480
並不代表 您的視訊來源的影像長寬尺寸 就是 640x480 ----------------------------- 假設
A 資料長度 = 10
B 資料長度 = 5
L = 10
執行 memcpy(A,B,L);
則將發生錯誤 http://netbook.mm520.net
發表人 - cmf 於 2005/01/31 21:51:30
------
︿︿ |
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |