【正点原子PYNQ学习系列】基础项目(一):颜色跟踪

一、实验内容
①完成单目标的颜色跟踪
②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()

未完待续

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little.Boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值