树莓派摄像头延迟问题,花了几毛钱淘宝买了csdn临时会员,下载了代码树莓派摄像头慢?使用OpenCV做图像处理摄像头图像延迟问题解决方法.pdf

实现代码如下:

import threading

import cv2
class Camera:
    def __init__(self, camera):
        self.frame = []
        self.ret = False
        self.cap = object
        self.camera = camera
        self.openflag = False
    def open(self):
        # if self.cap == object:
        self.cap = cv2.VideoCapture(self.camera)
        self.ret = self.cap.set(3, 320)
        self.ret = self.cap.set(4, 240)
        self.ret = False
        self.openflag = True
        threading.Thread(target=self.queryframe, args=()).start()
    def queryframe(self):
        # self.openflag = True
        # while True:
        while self.openflag:
            self.ret, self.frame = self.cap.read()
            # pass
    def getframe(self):
        return self.ret, self.frame
    def close(self):
        self.openflag = False
        self.cap.release()
def cameratest():
    camera = Camera(0)
    camera.open()
    while True:
        ret,image = camera.getframe()
        if ret:
            print(type(image))
            cv2.imshow('img',image)
            cv2.waitKey(10)
        else:
            print("read faild")
    camera.close()
    cv2.destroyAllWindows()
    
if __name__ == '__main__':
    cameratest()

树莓派乒乓球追踪程序

import threading
import numpy as np
import cv2

class Camera:
    def __init__(self, camera):
        self.frame = []
        self.ret = False
        self.cap = object
        self.camera = camera
        self.openflag = False
    def open(self):
        # if self.cap == object:
        self.cap = cv2.VideoCapture(self.camera)
        self.ret = self.cap.set(3, 320)
        self.ret = self.cap.set(4, 240)
        self.ret = False
        self.openflag = True
        threading.Thread(target=self.queryframe, args=()).start()
    def queryframe(self):
        # self.openflag = True
        # while True:
        while self.openflag:
            self.ret, self.frame = self.cap.read()
            # pass
    def getframe(self):
        return self.ret, self.frame
    def close(self):
        self.openflag = False
        self.cap.release()
def cameratest():
    camera = Camera(0)
    camera.open()
    while True:
        ret,image = camera.getframe()
        if ret:
            print(type(image))
            cv2.imshow('img',image)
            cv2.waitKey(10)
        else:
            print("read faild")
    camera.close()
    cv2.destroyAllWindows()
def draw_direction(img, lx, ly, nx, ny):
    # 根据上一位置与当前位置计算移动方向并绘制箭头
    dx = nx - lx
    dy = ny - ly
    if abs(dx) < 4 and abs(dy) < 4:
        dx = 0
        dy = 0
    else:
        r = (dx**2 + dy**2)**0.5
        dx = int(dx/r*40)
        dy = int(dy/r*40)
        # print(dx, dy)
    cv2.arrowedLine(img, (60, 100), (60+dx, 100+dy), (0, 255, 0), 2)

if __name__ == '__main__':
    # lower = np.array([10, 110, 110])  # 适用于橙黄色乒乓球
    # upper = np.array([20, 255, 255])
    lower = np.array([85, 110, 47])  # 适用于蓝色乒乓球
    upper = np.array([108, 255, 255])
    targetPos_x = 0
    targetPos_y = 0
    lastPos_x = 0
    lastPos_y = 0
    camera = Camera(0)
    camera.open()
    while True:
        ret, img = camera.getframe()
        if ret:
            imgHsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
            imgMask = cv2.inRange(imgHsv, lower, upper)  # 获取遮罩
            imgOutput = cv2.bitwise_and(img, img, mask=imgMask)
            im, contours, hierarchy = cv2.findContours(imgMask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 查找轮廓
            # 下面的代码查找包围框,并绘制
            x, y, w, h = 0, 0, 0, 0
            for cnt in contours:
                area = cv2.contourArea(cnt)
                # print(area)
                if area > 60:
                    x, y, w, h = cv2.boundingRect(cnt)
                    lastPos_x = targetPos_x
                    lastPos_y = targetPos_y
                    targetPos_x = int(x + w / 2)
                    targetPos_y = int(y + h / 2)
                    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
                    cv2.circle(img, (targetPos_x, targetPos_y), 2, (0, 255, 0), 4)
            # 坐标(图像内的)
            cv2.putText(img, "({:0<2d}, {:0<2d})".format(targetPos_x, targetPos_y), (20, 30),
                        cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 2)  # 文字
            draw_direction(img, lastPos_x, lastPos_y, targetPos_x, targetPos_y)
            cv2.imshow('img', img)
            print (targetPos_x,targetPos_y)
            cv2.waitKey(10)
        else:
            print("read faild")
    camera.close()
    cv2.destroyAllWindows()

发表评论