日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机视觉编程——增强现实基础

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机视觉编程——增强现实基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 增強現實
    • 1 PyGame和PyOpenGL
    • 2 從照相機矩陣到OpenGL格式
    • 3 在圖像中放置虛擬物體
    • 4 綜合集成

增強現實

增強現實是將物體和相應信息放置在圖像數據上的一系列操作的總稱。

1 PyGame和PyOpenGL

PyGame是非常流行的游戲開發工具包,可以簡單地處理顯示窗口、輸入設備、事件,以及其他內容。

PyOpenGL是OpenGL圖形編程的Python綁定接口,可以安裝在幾乎所有的系統上并且具有很好的圖形性能。

我們使用OpenGL將一個三維模型放置在一個場景中。為了使用PyGame和PyOpenGL工具包來完成,需要在腳本的開始部分載入下邊的命令:

from OpenGL.GL import * from OpenGL.GLU import * import pygame, pygame.image from pygame.locals import *

在這里主要使用OpenGL中的兩個部分:GL部分包含所有以"gl"開頭的函數;GLU部分是OpenGL的實用函數庫,里邊包含一些高層的函數,我們主要使用它完成設置照相機投影。

pygame部分用來設置窗口和事件控制;其中pygame.image用來載入圖像和創建OpenGL的紋理,pygame.locals用來設置OpenGL的顯示區域。

2 從照相機矩陣到OpenGL格式

OpenGL使用44的矩陣表示變換,與34的照相機矩陣略有差別。但是,照相機與場景的變換分成了兩個矩陣,GL_PROJECTION矩陣和GL_MODLEVIEW矩陣。前者處理圖像成像的性質,等價于內標定矩陣K;后者處理物體和照相機之間的三維變換關系,對應于照相機矩陣中的R和t部分。

下面的函數將照相機參數轉換為OpenGL中的投影矩陣:

def set_projection_from_camera(K):glMatrixMode(GL_PROJECTION)glLoadIdentity()fx = K[0, 0]fy = K[1, 1]fovy = 2 * arctan(0.5 * height / fy) * 180 / piaspect = (width * fy) / (height * fx)near = 0.1far = 100.0gluPerspective(fovy, aspect, near, far)glViewport(0, 0, width, height)

在上述代碼中,函數glMatrixMode()將工作矩陣設置為GL_PROJECTION,接下來的命令會修改這個矩陣。然后glLoadIdentity()函數將該矩陣設置為單位矩陣,根據圖像高度、照相機的焦距以及縱橫比,計算出視圖中的垂直場。OpenGL的投影同樣具有近距離和遠距離的裁剪平面來限制場景拍攝的深度范圍。

使用GLU的使用函數gluPerspective()設置投影矩陣,將整個圖像定義為視圖部分。

使用下面的函數實現如何獲得移除標定矩陣后的3*4針孔照相機矩陣,并創建一個模擬視圖:

def set_modelview_from_camera(Rt):glMatrixModel(GL_MODELVIEW)glLoadIdentity()Rx = array([[1, 0, 0], [0, 0, -1], [0, 1, 0]])R = Rt[:, :3]U, S, V = linalg.svd(R)R = dot(U, V)R[0, :] = -R[0, :]t = Rt[:, 3]M = eye(4)M[:3, :3] = dot(R, Rx)M[:3, 3] = tM = M.Tm = M.flatten()glLoadMatrixf(m)

上面的函數中,首先切換到GL_MODELVIEW矩陣,然后將該矩陣重置。創建一個90度的旋轉矩陣,由于估計照相機矩陣時,可能會有錯誤或者噪聲干擾,所以要確保照相機矩陣的旋轉部分確實是一個旋轉矩陣。將模擬視圖矩陣M設置成為旋轉矩陣的乘積,glLoadMatrixf()函數通過輸入參數為按列排列的16個數值數組,來設置模擬視圖。將M矩陣轉置,然后壓平并輸入glLoadMatrixf()函數。

3 在圖像中放置虛擬物體

我們首先需要將圖像作為背景添加進來,可以通過創建一個四邊形的方式來完成,該四邊形為整個視圖。下邊的函數可以載入一幅圖像,然后將其轉換成一個OpenGL紋理,并將該紋理放置在四邊形上:

def draw_background(imname):bg_image = pygame.image.load(imname).convert()bg_data = pygame.image.tostring(bg_image, "RGBX", 1)glMatrixMode(GL_MODEVIEW)glLoadIdentity()glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)glEnable(GL_TEXTURE_2D)glBindTexture(GL_TEXTURE_2D, glGenTextures(1))glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bg_data)glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)glBegin(GL_QUADS)glTexCoord2f(0.0, 0.0);glVertex3f(-1.0, -1.0, -1.0)glTexCoord2f(1.0, 0.0);glVertex3f(1.0, -1.0, -1.0)glTexCoord2f(1.0, 1.0);glVertex3f(1.0, 1.0, -1.0)glTexCoord2f(0.0, 1.0);glVertex3f(-1.0, 1.0, -1.0)glEnd()glDeleteTextures(1)

該函數首先使用PyGame中的一些函數來載入一幅圖像,將其序列化為能夠在PyOpenGL中使用的原始字符串表示。然后重置模擬視圖,清除顏色和深度緩存。接下來綁定這個紋理,使其能夠在四邊形和指定插值中使用。

使用下邊的命令產生一個相對大小為size的茶壺模型:

from OpenGL.GLUT import *glutSolidTeapot(size)

使用下邊的函數設置其顏色和其他特性:

def draw_teapot(size):glEnable(GL_LIGHTING)glEnable(GL_LIGHT0)glEnable(GL_DEPTH_TEST)glClear(GL_DEPTH_BUFFER_BIT)glMaterialfv(GL_FRONT, GL_AMBIENT, [0, 0, 0, 0])glMaterialfv(GL_FRONT, GL_DIFFUSE, [0.0, 0.5, 0.5, 0.0])glMaterialfv(GL_FRONT, GL_SPECULAR, [0.7, 0.6, 0.6, 0.0])glMaterialf(GL_FRONT, GL_SHININESS, 0.25 * 128.0)glutSolidTeapot(size)

4 綜合集成

使用下邊的腳本命令完成最后的操作:

width, height = 1000, 747def setup():"""設置窗口和pygame環境"""pygame.init()pygame.display.set_mode((width, height), OPENGL | DOUBLEBUF)pygame.display.set_caption("OpenGL AR demo")sift.process_image('book_frontal.jpg', 'im0.sift') l0, d0 = sift.read_features_from_file('im0.sift')sift.process_image('book_perspective.jpg', 'im1.sift') l1, d1 = sift.read_features_from_file('im1.sift')matches = sift.match_twosided(d0, d1) ndx = matches.nonzero()[0] fp = homography.make_homog(l0[ndx, :2].T) ndx2 = [int(matches[i]) for i in ndx] tp = homography.make_homog(l1[ndx2, :2].T)model = homography.RansacModel() H, inliers = homography.H_from_ransac(fp, tp, model)K = my_calibration((747,1000)) cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]]))))) box = cube_points([0, 0, 0.1], 0.1) box_cam1 = cam1.project(homography.make_homog(box[:, :5])) box_trans = homography.normalize(dot(H, box_cam1)) cam2 = camera.Camera(dot(H, cam1.P)) A = dot(linalg.inv(K), cam2.P[:, :3]) A = array([A[:, 0], A[:, 1], cross(A[:, 0], A[:, 1])]).T cam2.P[:, :3] = dot(K, A) box_cam2 = cam2.project(my_homography.make_homog(box))Rt = dot(linalg.inv(K), cam2.P)with open('ar_camera.pkl', 'r') as f:K = pickle.load(f)Rt = pickle.load(f)setup() draw_background('book_perspective.bmp') set_projection_from_camera(K) set_modelview_from_camera(Rt) draw_teapot(0.02)while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit() pygame.display.flip()

setup()函數會初始化PyGame,將窗口設置為圖像大小,繪制圖像區域為兩倍的OpenGL窗口緩存大小,載入背景使其與窗口相符,然后設定照相機和模擬視圖矩陣,最后在正確的位置繪制出茶壺。顯示的結果如下圖所示:

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的计算机视觉编程——增强现实基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。