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

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

//初始化視頻設備
PalCapture.Init( 0, false, 768, 576, 3, 30, true);
//開啟紋理映射和設置紋理參數
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 );

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

return true;
}
下面為繪制函數:
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) //將圖像原點統一設置成左下角
 {
cvFlip(pFrmImage, pTempImg, 0); //翻轉圖像
pTempImg->origin = IPL_ORIGIN_BL; //將pTempImg圖像的原點設置成左下角
}
//更新紋理
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是視頻采集卡類的對象,獲取一幀圖像即pFrmImage,pFrmImage是IplImage類型的圖像,此處直接對pFrmImage的imageData進行操作。 關于顯示視頻 (AVI視頻) ,NEHE的OpenGL課程的第35課中有詳細介紹,我也是參考那個的~~只不多OpenCV中有翻轉函數cvFlip函數,我就不用自己寫了~~ NEHE的課程還提到:使用glTexSubImage2D()另一個重要原因.不僅因為在許多OpenGL實現中它很快,還因為目標區不必是2的冪.這對視頻重放很方便,因為一幀的維通常不是2的冪(而是像320*200之類的).這樣給了你很大機動性,你可以按視頻流原本的樣子播放,而不是扭曲或剪切每一幀來適應紋理的維。
所以這里我沒有把圖像轉換成紋理要求的大小(大小為2的非負n次冪),不知道這樣做對不對,不過畫面顯示效果看起來還不錯。 這么幾行代碼,我還弄了一天,貌似紅寶書上有的,還是基礎不牢噢  。明天有網絡傳輸數據方面的任務,關于網絡,我可是一點都不懂  ,慢慢看吧  。
Feedback
# re: 【原】OpenGL顯示視頻(7月27日工作小記) 回復 更多評論
2009-07-28 15:14 by
奧斯卡大家阿斯頓!
# re: 【原】OpenGL顯示視頻(7月27日工作小記) 回復 更多評論
2012-09-06 18:46 by
贊
|