|
Posted on 2009-07-27 20:49 千張 閱讀(7984) 評(píng)論(2) 編輯 收藏 引用 所屬分類: 圖形學(xué)
這周是實(shí)習(xí)的第三周了,堅(jiān)持了兩周,慢慢也就習(xí)慣上班了,好了,說(shuō)正事吧,O(∩_∩)O~ 今天小秦老師交給我的任務(wù)是用OpenGL顯示攝像頭中拍攝的畫面,要全屏顯示的。上周他已經(jīng)把程序框架給了我,所以一些初始化的工作我就不用做了,直接加?xùn)|西就行了。 從圖像采集卡中讀取圖像采用的是小秦老師給我的dll,他們自己編寫的類,可以參考OpenCV'中的ARFrameGrabber類。
獲取當(dāng)前幀后,顯示圖像就很容易了,可以用紋理映射,將當(dāng)前幀映射到一個(gè)矩形上,該矩形大小為視口大小。 下面為初始化函數(shù):
bool OpenGLDraw::Initialize()
  {
//opengl Initialize

//獲得屏幕分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);

//初始化視頻設(shè)備
PalCapture.Init( 0, false, 768, 576, 3, 30, true);
//開啟紋理映射和設(shè)置紋理參數(shù)
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //線性濾波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); //線性濾波
//生成空紋理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 576, 0, GL_RGB, GL_UNSIGNED_BYTE,NULL );

 /**//********************觀察視點(diǎn)設(shè)置*******************/
glViewport(0, 0, nFullWidth, nFullHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

return true;
}
下面為繪制函數(shù):
void OpenGLDraw::Draw()
  {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glLoadIdentity();
pFrmImage = PalCapture.GetImage();
IplImage *pTempImg = cvCloneImage( pFrmImage);
if (pFrmImage->origin == IPL_ORIGIN_TL) //將圖像原點(diǎn)統(tǒng)一設(shè)置成左下角
 {
cvFlip(pFrmImage, pTempImg, 0); //翻轉(zhuǎn)圖像
pTempImg->origin = IPL_ORIGIN_BL; //將pTempImg圖像的原點(diǎn)設(shè)置成左下角
}
//更新紋理
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 768, 576, GL_RGB, GL_UNSIGNED_BYTE, pTempImg->imageData);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f,-1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f,1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f,1.0f);
glEnd();
glFlush();
cvReleaseImage(&pTempImg);
}

其中PalCapture是視頻采集卡類的對(duì)象,獲取一幀圖像即pFrmImage,pFrmImage是IplImage類型的圖像,此處直接對(duì)pFrmImage的imageData進(jìn)行操作。 關(guān)于顯示視頻 (AVI視頻) ,NEHE的OpenGL課程的第35課中有詳細(xì)介紹,我也是參考那個(gè)的~~只不多OpenCV中有翻轉(zhuǎn)函數(shù)cvFlip函數(shù),我就不用自己寫了~~ NEHE的課程還提到:使用glTexSubImage2D()另一個(gè)重要原因.不僅因?yàn)樵谠S多OpenGL實(shí)現(xiàn)中它很快,還因?yàn)槟繕?biāo)區(qū)不必是2的冪.這對(duì)視頻重放很方便,因?yàn)橐粠木S通常不是2的冪(而是像320*200之類的).這樣給了你很大機(jī)動(dòng)性,你可以按視頻流原本的樣子播放,而不是扭曲或剪切每一幀來(lái)適應(yīng)紋理的維。
所以這里我沒有把圖像轉(zhuǎn)換成紋理要求的大小(大小為2的非負(fù)n次冪),不知道這樣做對(duì)不對(duì),不過(guò)畫面顯示效果看起來(lái)還不錯(cuò)。 這么幾行代碼,我還弄了一天,貌似紅寶書上有的,還是基礎(chǔ)不牢噢  。明天有網(wǎng)絡(luò)傳輸數(shù)據(jù)方面的任務(wù),關(guān)于網(wǎng)絡(luò),我可是一點(diǎn)都不懂  ,慢慢看吧  。
|