该程序需要用到camera_mtx.txt为相机内参数矩阵文本文档,camera_dist.txt为畸变参数矩阵文本文档,TEST.png为标记图像。生成方法在上一章
AR 算法
QQ图片20200426102332.png
ARDemo类实现绘制摄像机帧图像,三维模型
import cv2
import numpy as np
from OpenGL.GL import *
from OpenGL.GLUT import *
from PIL import Image
import logging
from pattern_detector import PatternDetector
class ARDemo:
def __init__(self, mark_image_name):
self.camera_mtx = np.loadtxt('camera_mtx.txt')
self.camera_dist = np.loadtxt('camera_dist.txt')
self.camera = cv2.VideoCapture(0+cv2.CAP_DSHOW)
self.camera.open(0+cv2.CAP_DSHOW)
self.image_width = int(self.camera.get(cv2.CAP_PROP_FRAME_WIDTH))
self.image_height = int(self.camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
self.scene_image = None
self.scene_tex_id = 0 # 帧图像纹理句柄
self.mark_image = cv2.imread(mark_image_name)
self.decetor = PatternDetector(self.mark_image, self.camera_mtx, self.camera_dist)
self.proj_mat = self.decetor.get_gl_proj_mat(self.image_width, self.image_height)
self.modelview_mat = np.eye(4).flatten()
self.wait_count = 0
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowPosition(0, 0)
glutInitWindowSize(self.image_width, self.image_height)
glutCreateWindow('AR Demo')
glutDisplayFunc(self.display_event)
glutIdleFunc(self.display_event)
glutWMCloseFunc(self.close_event)
self.init_gl()
# 异常处理装饰器, 捕捉func执行时产生的异常, 在异常发生后关闭摄像头并退出
def process_exception(func):
def wrap(self):
try:
func(self)
except Exception as e:</