美文网首页
用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