美文网首页
用python做简易AR

用python做简易AR

作者: 圣_狒司机 | 来源:发表于2020-04-16 23:06 被阅读0次

    实现用现实中手持红色的笔接屏幕中掉落的小方块;

    import pyglet
    from pyglet.window import key
    import cv2 as cv
    import pymunk
    from pymunk.pyglet_util import DrawOptions
    import numpy as np
    
    opt = DrawOptions()
    cap = cv.VideoCapture(0)
    
    def get_pencil_pos(image):
        HSV = cv.cvtColor(image,cv.COLOR_BGR2HSV)
        lower_red = np.array([0,195,35])
        upper_red = np.array([7,230,255])
        gray = cv.inRange(HSV, lower_red, upper_red)
        edges = cv.Canny(gray,50,150,apertureSize=3)
        try:
            lines = cv.HoughLinesP(edges,1,np.pi/180,60,minLineLength=60,maxLineGap=10)[:,0,:]
            if len(lines)>0:
                x1,y1,x2,y2 = lines[0]
                return 620-x1,480-y1,620-x2,480-y2
        except Exception as e:
            pass
    
    class App(pyglet.window.Window):
        def __init__(self):
            super().__init__()
            _, self.image = cap.read()
            self._image =cv.flip(self.image,-1).tostring()
            self.img = pyglet.image.ImageData(640,480,"BGR",self._image)
            self.pencil_pos = [0,0,0,0]
            self.space = pymunk.Space()
            self.space.gravity = 0,-100
            self.body = pymunk.Body(1,1666)
            self.body.position = 300,400
            self.poly = pymunk.Poly.create_box(self.body,(50,50))
            self.poly.elasticity = 1
            self.poly.friction = 0.6
            self.brick_body = pymunk.Body(body_type=pymunk.Body.KINEMATIC)
            self.brick_body.position = 573, 77
            self.brick_shape = pymunk.Poly.create_box(self.brick_body, (100,10))
            self.brick_shape.elasticity = 0.7
            self.brick_shape.friction = 0.6
            self.space.add(self.body, self.poly,self.brick_body,self.brick_shape)
            
            
    
        def update(self,dt):
            _, self.image = cap.read()
            self.pencil_pos = get_pencil_pos(self.image)
            try:
                self.brick_body.position = self.pencil_pos[:2]
            except Exception as e:
                pass
    
            self._image =cv.flip(self.image,-1).tostring()
            self.img = pyglet.image.ImageData(640,480,"BGR",self._image)
            self.space.step(dt)
    
        def on_draw(self):
            self.clear()
            self.img.blit(0,0)
            self.space.debug_draw(opt)
            
        def on_key_press(self,symbol, modifiers):
            if symbol == key.A:
                print('The "A" key was pressed.')
            elif symbol == key.LEFT:
                print('The left arrow key was pressed.')
            elif symbol == key.ENTER:
                print('The enter key was pressed.')
    
    app = App()
    pyglet.clock.schedule_interval(app.update, 1/30)
    pyglet.app.run()
    cap.release()
    

    相关文章

      网友评论

          本文标题:用python做简易AR

          本文链接:https://www.haomeiwen.com/subject/skgjvhtx.html