树莓派摄像头延迟问题,花了几毛钱淘宝买了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()