一、实验内容
①完成单目标的颜色跟踪
②PL+PS和纯PS的速度比较
二、实验板卡
正点原子的领航者7020
二、PS+PL实现
Step 1:初始化Overlay以下载bitstream
from pynq import Overlay
from pynq.lib.iic import *
from pynq.lib.video2lcd import *
from pynq.lib.ov5640 import OV5640
ov5640_ol = Overlay("read_bit/ov5640_Image_process.bit")
Step 2:实例化I2C以配置OV5640 Camera
iic = AxiIIC(ov5640_ol.ip_dict['cam_iic'])
# OV5640器件地址
address = 0x3c
ov5640= OV5640(address, iic)
ov5640.init() #初始化OV5640
ov5640.focus_init()
ov5640.focus_continue()
video_in = ov5640_ol.video.video_in
video_out = ov5640_ol.video.video_out
lcd_id = video_out.lcd_id_rd()
print("lcd_id=",hex(lcd_id))
# 4.3寸480*272 RGB屏,ID=0X4342
# 7寸800*480 RGB屏,ID=0X7084
# 7寸1024*600 RGB屏,ID=0X7016
# 4.3寸800*480 RGB屏,ID=0X4384
# 10.1寸1280*800 RGB屏,ID=0X1018
# 其他值,非法ID;
#根据获取的LCD的ID号来进行ov5640显示分辨率参数的选择
if lcd_id == 0x4342 : #4.3寸屏,480*272分辨率
cmos_h_pixel = 480
cmos_v_pixel = 272
total_h_pixel = 1800
total_v_pixel = 1000
elif lcd_id == 0x4384 : #4.3寸屏,800*480分辨率
cmos_h_pixel = 800
cmos_v_pixel = 480
total_h_pixel = 1800
total_v_pixel = 1000
elif lcd_id == 0x7084 : #7寸屏,800*480分辨率
cmos_h_pixel = 800
cmos_v_pixel = 480
total_h_pixel = 1800
total_v_pixel = 1000
elif lcd_id == 0x7016 : #7寸屏,1024*600分辨率
cmos_h_pixel = 1024
cmos_v_pixel = 600
total_h_pixel = 2200
total_v_pixel = 1000
elif lcd_id == 0x1018 : #10.1寸屏,1280*800分辨率
cmos_h_pixel = 1280
cmos_v_pixel = 800
total_h_pixel = 2570
total_v_pixel = 980
else:
cmos_h_pixel = 480
cmos_v_pixel = 272
total_h_pixel = 1800
total_v_pixel = 1000
ov5640.set_outsize(cmos_h_pixel,cmos_v_pixel,total_h_pixel,total_v_pixel)
# mode = VideoMode(800, 480, 24)
video_out.configure(1)
video_in.configure(video_out.mode)
ov5640_ol.ip_dict
rgb2hsv = ov5640_ol.video.camera_in.rgb2hsv_0
rgb2hsv?
erosion_accel = ov5640_ol.video.camera_in.erosion_accel_0
erosion_accel?
#rgb2hsv
rgb2hsv.mmio.write(16, video_out.mode.height)
rgb2hsv.mmio.write(24, video_out.mode.width)
#erosion_accel
erosion_accel.mmio.write(28, video_out.mode.height)
erosion_accel.mmio.write(36, video_out.mode.width)
from pynq import allocate
input_buffer = allocate(shape=(9,),dtype='u8')
input_buffer[:] = [0,1,0,
1,1,1,
0,1,0]
input_buffer.flush()```
```python
video_in.start()
video_out.start()
video_in.tie(video_out)
import cv2
import time
num_frames = 0
readError = 0
ball_color = 'red'
color_dist = {'blue': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},
'red': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},
'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},
}
while True:
start = time.time()
frame = video_in.readframe()
# gs_frame = cv2.GaussianBlur(frame, (5, 5), 0) # 高斯模糊
# hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 转化成HSV图像
# erode_hsv = cv2.erode(frame, None, iterations=2) # 腐蚀 粗的变细
inRange_hsv = cv2.inRange(frame, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])
_,cnts,_ = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# cv2.putText(frame,"red",(x,y),0,0.8,(0,0,255),2)
c = max(cnts, key=cv2.contourArea)
rect = cv2.minAreaRect(c) # 查找最小区域
box = cv2.boxPoints(rect) # 计算最小面积矩形的坐标
# outframe = video_out.newframe()
cv2.cvtColor(frame,cv2.COLOR_HSV2RGB,dst=frame)
outframe = cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)
# edges_x =
# edges_y =
cv2.putText(outframe,"FPS:"+str(round(1/(time.time()-start),2)),(1,20),0,0.8,(0,0,255),2)
video_out.writeframe(outframe)
num_frames+=1
video_in.close()
video_out.close()
未完待续