利用opencv读取图片将其作为opengl的纹理图片的实现方法
在opengl中實(shí)現(xiàn)三維物體的紋理貼圖的第一步就是要讀入圖片,然后指定該圖片為紋理圖片。我最早接手的項(xiàng)目中是通過(guò)一個(gè)專(zhuān)門(mén)的讀取bmp圖片的函數(shù)來(lái)實(shí)現(xiàn)紋理圖片的讀取的。這個(gè)函數(shù)有三個(gè)缺點(diǎn):
1、只能讀取bmp的圖片,無(wú)法讀取jpg,ppm等其他類(lèi)型的圖片,要想使用其他類(lèi)型的圖片,必須事先將他們轉(zhuǎn)化成bmp的圖片;
2、只能讀取2的冪次方寬和2的冪次方長(zhǎng)的大小的圖片,否則函數(shù)無(wú)法正確讀取圖片內(nèi)容;
3、只能讀取24位的bmp圖片。
???上述三個(gè)缺點(diǎn)使我們的程序有了很大的局限性。為此,在學(xué)習(xí)了opencv之后,我利用opencv中的cvloadimage()函數(shù)解決了上述問(wèn)題。
我們的解決方法如下:
?? 首先利用下面這行代碼將圖片讀取到內(nèi)存中:
???IplImage * Iface = cvLoadImage(szFileName);
?? 然后利用下面代碼在內(nèi)存中開(kāi)辟一個(gè)跟讀入圖片大小相同的內(nèi)存空間:
??m_new_face_BMPbytes = (unsigned char *)malloc(sizeof(unsigned char)*Iface->imageSize);
??如果我們讀取的是24位的rgb彩色圖片,那么Iface->imageSize幾位圖片的像素大小乘以3,比如我們的圖片是512*512大小的那么Iface->imageSize就是512*512*3.
??接著我們利用下面的代碼將Iface中的圖片的實(shí)際數(shù)據(jù)部分拷貝到我們制定的內(nèi)存空間中:
??memcpy(m_new_face_BMPbytes,Iface->imageData,sizeof(unsigned char)*Iface->imageSize);
??Iface->imageData為存儲(chǔ)圖片像素?cái)?shù)據(jù)的空間的首地址
??然后我們保存圖片的大小:
? m_new_face_width = Iface->width;
? m_new_face_Height = Iface->height;
??最后我們?cè)O(shè)置將m_new_face_BMPbytes指向的圖片數(shù)據(jù)制定為opengl中的紋理圖片:
?glGenTextures(1, &m_texName); //1表示生成紋理的數(shù)量,m_texName用來(lái)存儲(chǔ)生成紋理的索引,在綁定紋理的時(shí)候用到
??glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
?glDisable(GL_LIGHTING);
?glEnable(GL_TEXTURE_2D);
?
?glBindTexture(GL_TEXTURE_2D,?m_texName);
?glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
?glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
?glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
?glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
?glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,?m_new_face_width,?m_new_face_Height, 0,
??GL_BGR_EXT, GL_UNSIGNED_BYTE,?m_new_face_BMPbytes);
這樣我們就完成了將我們讀入的圖片設(shè)置成為opengl的紋理圖片的設(shè)置了。
總結(jié)
以上是生活随笔為你收集整理的利用opencv读取图片将其作为opengl的纹理图片的实现方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机视觉及机器学习论文、源代码合集
- 下一篇: 对焦算法总结