'''
可以成功的从摄像头读取视屏频,并且可以处理每一帧图片,将(最)红色物体跟踪标记
successful !!
'''
import numpy as np
import cv2
mask_color = [255, 255, 255]
# 用绿色点标记出红色区域的中心
def mask_center_redArea(srcArr, x_center, y_center, mask_color):
# scope 的值用于控制标记点的大小
scope = 8
print('srcArr.shape', srcArr.shape)
rowMax = srcArr.shape[0]
colMax = srcArr.shape[1]
for rowIndex in range(x_center - scope, x_center + scope):
for colIndex in range(y_center - scope, y_center + scope):
if (rowIndex >= rowMax):
rowIndex = rowMax - 1
elif (colIndex >= colMax):
colIndex = colMax - 1
else:
srcArr[rowIndex][colIndex] = mask_color
# cv2.imshow('mask_img_point', srcArr)
return srcArr
def findBasket_R(srcImgArr):
# 原图 srcImg
# srcImg = cv2.imread("redArea.png")
# srcImg = cv2.imread("test2.jpg")
srcImg = srcImgArr
# cv2.imshow('src_img', srcImg)
print('type(srcImg) = ', type(srcImg))
srcArr_gray = cv2.cvtColor(srcImg, cv2.COLOR_RGB2YCrCb)
# 分离通道
B_img, G_img, R_img = cv2.split(srcArr_gray)
# cv2.imshow('blue', B_img)
# cv2.imshow('green', G_img)
# cv2.imshow('red', R_img)
'''
(T, thresh) = cv2.threshold(R_img, 155, 255, cv2.THRESH_BINARY) # 阈值化处理,阈值为:155
cv2.imshow("Threshold Binary", thresh)
(T, threshInv) = cv2.threshold(R_img, 155, 255, cv2.THRESH_BINARY_INV) # 反阈值化处理,阈值为:155
cv2.imshow("Threshold Binary Inverse", threshInv)
'''
min_val, max_val, min_pt, max_pt = cv2.minMaxLoc(R_img)
srcArr = np.array(srcImg)
x_center = max_pt[0]
y_center = max_pt[1]
print('srcArr.shape = ', srcArr.shape)
print('x_center = ', x_center)
print('y_center = ', y_center)
dstArr = mask_center_redArea(srcArr, y_center, x_center, max_val)
return dstArr
# 从摄像头读取视频并播放
def readImg_from_camera():
cap = cv2.VideoCapture(0)
if cap.isOpened():
print('camera is open')
else:
return False
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # 设置分辨率
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
cap.set(cv2.CAP_PROP_EXPOSURE, -4)
print('视频宽:{} 高:{} 当前曝光:{}'.format(cap.get(cv2.CAP_PROP_FRAME_WIDTH),
cap.get(cv2.CAP_PROP_FRAME_HEIGHT),
cap.get(cv2.CAP_PROP_EXPOSURE)))
while True:
ret, frame = cap.read() # 读取每一帧图片
# print('type(frame) = ', type(frame))
img = findBasket_R(frame)
cv2.imshow('circle aim', img) # 显示每一帧图片
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
# findBasket_R()
readImg_from_camera()
cv2.waitKey(0)