MaixPy OpenMV 添加 ov5642 支持

本文介绍如何将OV5642摄像头集成到sensor中,包括所需接口(SCCB和DVP)、文件创建、初始化函数实现及寄存器配置等关键步骤。解决了图像颜色偏差、帧率低等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ov5642 摄像头添加到 sensor

通讯接口

  1. sccb 接口,该接口与 i2c 相差不大,用于配置摄像头寄存器。
  2. dvp 接口,该接口用于传输图像数据。

需要创建的文件

参考其他摄像头,一般为 ov5642.c(提供 sensor 所需要的接口), ov5642.hov5642_regs.h(提供 ov5642 的寄存器配置表)

需要准备的资料

  1. OV5642-DS.pdf(数据手册)
  2. OV5642_camera_new-module_software_application_notes_1.3_MESADA.pdf(软件应用笔记)

这些资料都可以从官网自行下载
在这里插入图片描述

需要实现的方法

  • 初始化函数 ov5642_init()

该函数将 sensor 所有方法指向 ov5642 对应方法,用户只需要调用 sensor 即可,实现该函数就是也是最终目标

int ov5642_init(sensor_t *sensor)
{
    // Initialize sensor structure.
    sensor->gs_bpp              = 1;
    sensor->reset               = reset;
    sensor->sleep               = sleep;
    sensor->read_reg            = read_reg;
    sensor->write_reg           = write_reg;
    sensor->set_pixformat       = set_pixformat;
    // ..............
    return 0;
}
  • 重置 reset()

该函数在 sensor 初始化后将会调用,此时会配置大量寄存器,用于初始化 ov5642,寄存器配置具体值可参考应用手册的默认配置。

在这里插入图片描述

for (int i=0; OV5642_ovga_30fps_regs[i][0]; i++) {
    cambus_writeb(sensor->slv_addr, OV5642_ovga_30fps_regs[i][0], OV5642_ovga_30fps_regs[i][1]); // sccb write
}
  • 其他函数均可参考寄存器手册实现

  • sensor 中添加 ov5642 检测即可完成

// sensor.h
#define OV5640_ID		(0x5640)

// sensor.c
int sensro_ov_detect(sensor_t *sensor){
    // .............
    case OV5642_ID:
    mp_printf(&mp_plat_print, "[MAIXPY]: find ov5642\n");
    init_ret = ov5642_init(sensor);
    break;
    // .............
}

遇到的问题

  1. 图像中间泛绿, 边缘泛红

使能 RawGamma 后解决

cambus_writeb(sensor->slv_addr, 0x5000, 0x6f); //RAW Gamma enable
  1. 帧率较低

配置以下寄存器,调高时钟速率,时钟速率公式可从 datasheet 中得到:
System clock frequency = PLL input clock x PLL DIVP / PLL DIVS / 4
PLL VCO frequency = PLL input clock x PLL DIVP x PLL SELD5

在这里插入图片描述
在这里插入图片描述

{0x3011, 0x0e},/*pll divp*/ {0x3012, 0x03},/*pll div*/
  1. 切换到 RGB565 拍摄一张照片后卡住, 未开启 YUVtoRGBDither, 关于 Dither
    在这里插入图片描述
cambus_writeb(sensor->slv_addr, 0x5002, 0xf8);//R
  1. ov5642 qqvga 格式会出现一小根彩色条纹: 未解决

顺便提一下 ov2640 出现的问题

  1. ov2640 边缘暗,中间亮: lenc 未开启, 开启之后便显示正常, 关于 lenc
    在这里插入图片描述

  2. ov2640 图像有噪点: 降低时钟速率后并没有改善, 可能是供电问题
    在这里插入图片描述

THRESHOLD = (0, 23, -128, 127, -128, 127) # Grayscale threshold for dark things... import sensor, image, time from pyb import LED from machine import UART import struct sensor.reset() sensor.set_vflip(False) # 设置OpenMV图像“水平方向进行翻转” sensor.set_hmirror(False) # 设置OpenMV图像“竖直方向进行翻转” sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQQVGA) # 80x60 (4,800 pixels) - O(N^2) max = 2,3040,000. # 线性回归算法的运算量大,越小的分辨率识别的效果越好,运算速度越快 #sensor.set_windowing([0,20,80,40]) sensor.skip_frames(time = 2000) # WARNING: If you use QQVGA it may take seconds clock = time.clock() # to process a frame sometimes. myuart = UART(1, 115200) # UART(1)是P0-RX P1-TX myuart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位 def send_data_packet(x, y): temp = struct.pack(">bbii", #格式为小端模式俩个字符俩个整型 0xAA, #帧头1 0xBB, #帧头2 int(x), # up sample by 4 #数据1 int(y)) # up sample by 4 #数据2 myuart.write(temp) #串口发送 while(True): clock.tick() img = sensor.snapshot().binary([THRESHOLD]) ''' 截取一张图片,进行 “阈值分割” 阈值分割函数image.binary()对图像进行二值化(binary:二元的;由两部分组成的) 得到的效果是:将阈值颜色变成白色,非阈值颜色变成黑色''' line = img.get_regression([(100,100)], robust = True)#调用线性回归函数 # 对所有的阈值像素进行线性回归 # 线性回归的效果就是将我们视野中“二值化”分割后的图像回归成一条直线 if (line): ####### rho_err = abs(line.rho())-img.width()/2 # 计算我们的直线相对于中央位置偏移的距离(偏移的像素) # abs()函数:返回数字的绝对值 line.rho():返回霍夫变换后的直线p值。 if line.theta()>90: theta_err = line.theta()-180 else: theta_err = line.theta() ######### # 进行坐标的变换:y轴方向为0°,x轴正方向为90°,x轴负方向为-90° img.draw_line(line.line(), color = 127) print(rho_err,line.magnitude(),theta_err) #line.magnitude()返回一个表示“线性回归效果”的值,这个值越大,线性回归效果越好; # 如果越接近于0,说明我们的线性回归效果越接近于一个圆,效果越差 if line.magnitude()>8: send_data_packet(rho_err,theta_err) LED(1).off() else: LED(1).on() LED(2).off() else: LED(2).on() pass #print(clock.fps())(这个是openmv的巡线代码,如果是用k210,应该对代码做哪些改动?)
07-31
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值