OV7725鹰眼摄像头

article/2025/9/13 21:49:59

OV7725鹰眼摄像头如何使用?
目前的ov7725鹰眼摄像头,基本上用的都是山外的库,所以今天我们主要根据山外的库,基于k60芯片,给大家具体的讲解。

1.摄像头初始化

首先是摄像头的第一步就是初始化,这个我们直接去调用就行!

camera_init(imgbuff);

当然小伙伴在这里需要记住,需要配置中断优先级!对于我们使用摄像头的车而言,一般优先级最高的就是摄像头,所以小伙伴要记着给它分配优先级!我这里是分了五个优先级!大家也可以根据自己的需求,进行自主分配。

   NVIC_SetPriorityGrouping(5);      //设置优先级分组,4bit 抢占优先级,没有亚优先级    NVIC_SetPriority(PORTA_IRQn,0);   //配置优先级     摄像头NVIC_SetPriority(DMA0_IRQn,1);    //配置优先级     摄像头DMANVIC_SetPriority(PIT0_IRQn,2);    //配置优先级     正交解码NVIC_SetPriority(PORTE_IRQn,3);   //配置优先级     NRF通信set_irq_priority(UART1_RX_TX_IRQn,4);

这里面如果不太懂中断和优先级处理的小伙伴,可以看我的下一篇文章里面,会给大家详细介绍的。
下面还有一个很重要的点就是配置摄像头的属性,这个说的通俗一点,就是我们的图像大小是多大的呢?一般对于ov7725鹰眼摄像头来说,他的大小一般是6080或者120160,在这里我用的是120*160,这个大家可以根据自己的需求进行调整。

//配置摄像头 属性
#define OV7725_EAGLE_DMA_CH       DMA_CH0                               //定义摄像头的DMA采集通道
#define OV7725_EAGLE_W            160                                    //定义摄像头图像宽度
#define OV7725_EAGLE_H            120                                    //定义摄像头图像高度
#define OV7725_EAGLE_SIZE         (OV7725_EAGLE_W * OV7725_EAGLE_H/8 )  //图像占用空间大小
#define OV7725_EAGLE_DMA_NUM      (OV7725_EAGLE_SIZE )                  //DMA采集次数

上述的相关配置文件都在“VCAN_OV7725_Eagle.h”
**

2.摄像头的采集

**
在第一步摄像头初始化完了之后,我们就可以正常进行图像采集了,下面就是基本的步骤,首先大家需要理解,如果摄像头我们想要看到正常的图像,那我们需要哪些步骤?
第一步肯定是获取图像对吧,所以这里我们只需要在相应的文件里面调用对应的函数就行。

#define camera_get_img()        ov7725_eagle_get_img()
/*上面这个是接口原型,我们直接调用下面这个就行*/
camera_get_img()

ok,现在我们获取了图像,是不是需要把这个图像正常的显示出来,但是ov7725是硬件二值化摄像头,也就是说他的输出就是0和1,即就是黑和白,那我们应该怎么样去定义黑和白呢,这就是第二步图像解压,在图像解压这里,我们也可以认为的去定义,0是黑还是白呢。

void img_extract(uint8 dst[][CAMERA_W], uint8 src[][CAMERA_W/8])
{uint8 colour[2] = {255, 0}; //0 和 1 分别对应的颜色//注:山外的摄像头 1 表示 白色,0表示 黑色uint8 tmpsrc;uint8 i,j;for(j=0;j<CAMERA_H;j++){    for(i=0;i<CAMERA_W/8;i++){tmpsrc = src[j][i];dst[j][8*i+0] = colour[ (tmpsrc >> 7 ) & 0x01 ];dst[j][8*i+1] = colour[ (tmpsrc >> 6 ) & 0x01 ];dst[j][8*i+2] = colour[ (tmpsrc >> 5 ) & 0x01 ];dst[j][8*i+3] = colour[ (tmpsrc >> 4 ) & 0x01 ];dst[j][8*i+4] = colour[ (tmpsrc >> 3 ) & 0x01 ];dst[j][8*i+5] = colour[ (tmpsrc >> 2 ) & 0x01 ];dst[j][8*i+6] = colour[ (tmpsrc >> 1 ) & 0x01 ];dst[j][8*i+7] = colour[ (tmpsrc >> 0 ) & 0x01 ];}}   
}

在上面你也可以根据自己喜好,人为的修改0代表的是黑还是白,在这里不做过多的解释,相信大家都能理解。
当然在完成上述两个步骤之后,我们的摄像头图像就会有了,这个时候,你可以通过上位去观看,也可以使用oled、tft、ips等一些屏幕来实时观看,在这里给大家看一下我准备的几张赛道图像。
弯道

起跑线
s弯道
这就是一些基本的赛道图像,在这里我是通过上位机来观看的。小伙伴也可以通过屏幕里观看,这样就更加直接方便。
**

3.将图像显示在oled上面

**
在这里为了能让大家更加直观方便的观察赛道图像,这里我给大家写一个讲图像显示在oeld屏幕上的一个小代码。

void dis_oled(uint16 high, uint16 width, uint8 *p,uint8 value)
{int16 i,j;int16 temp,temp1;uint8 dat;       temp1 = high%16;if(temp1 == 0) temp = high/16;else           temp = high/16+1;  for(i=0; i<temp; i++){OLED_Set_Pos(0,i);for(j=0; j<width; j+=2){dat = 0;if( i<(temp-1) || !temp1 || temp1>=1)dat |= (*(p+i*8*width+j+width*0) > value? 1: 0)<<0;if( i<(temp-1) || !temp1 || temp1>=2)dat |= (*(p+i*8*width+j+width*1) > value? 1: 0)<<1;if( i<(temp-1) || !temp1 || temp1>=3)dat |= (*(p+i*8*width+j+width*2) > value? 1: 0)<<2;if( i<(temp-1) || !temp1 || temp1>=4)dat |= (*(p+i*8*width+j+width*3) > value? 1: 0)<<3;if( i<(temp-1) || !temp1 || temp1>=5)dat |= (*(p+i*8*width+j+width*4) > value? 1: 0)<<4;if( i<(temp-1) || !temp1 || temp1>=6)dat |= (*(p+i*8*width+j+width*5) > value? 1: 0)<<5;if( i<(temp-1) || !temp1 || temp1>=7)dat |= (*(p+i*8*width+j+width*6) > value? 1: 0)<<6;if( i<(temp-1) || !temp1 || temp1>=8)dat |= (*(p+i*8*width+j+width*7) > value? 1: 0)<<7;OLED_WrDat(dat);}}
}
void dis_oled(uint16 high, uint16 width, uint8 *p,uint8 value)
{int16 i,j;int16 temp,temp1;uint8 dat; temp1 = high%16;if(temp1 == 0) temp = high/16;else           temp = high/16+1;for(i=0; i<temp; i+=1){OLED_Set_Pos(0,i);for(j=0; j<width; j+=2){dat = 0;if( i<(temp-1) || !temp1 || temp1>=1)dat |= (*(p+i*16*width+j+width*0) > value? 1: 0)<<0;if( i<(temp-1) || !temp1 || temp1>=2)dat |= (*(p+i*16*width+j+width*2) > value? 1: 0)<<1;if( i<(temp-1) || !temp1 || temp1>=3)dat |= (*(p+i*16*width+j+width*4) > value? 1: 0)<<2;if( i<(temp-1) || !temp1 || temp1>=4)dat |= (*(p+i*16*width+j+width*6) > value? 1: 0)<<3;if( i<(temp-1) || !temp1 || temp1>=5)dat |= (*(p+i*16*width+j+width*8) > value? 1: 0)<<4;if( i<(temp-1) || !temp1 || temp1>=6)dat |= (*(p+i*16*width+j+width*10) > value? 1: 0)<<5;if( i<(temp-1) || !temp1 || temp1>=7)dat |= (*(p+i*16*width+j+width*12) > value? 1: 0)<<6;if( i<(temp-1) || !temp1 || temp1>=8)dat |= (*(p+i*16*width+j+width*14) > value? 1: 0)<<7;     OLED_WrDat(dat);}}
}

上述的这两个方法都是可行,只不过我用的图像大小是120*160,但是我们用的oled是12864,所以为了能够等比缩放,把图像给压缩了,但是实际效果并不是很影响,如果你用的屏幕分辨率较高,完全可以不用考虑这一点。
如果完成这三步,那我们最基础的摄像头采集和显示就完成,至于后续的图像处理和阳光算法,我也会慢慢给大家讲解。感兴趣的小伙伴可以看后续的文章。


http://chatgpt.dhexx.cn/article/YKBSKt4b.shtml

相关文章

OV7725摄像头图像采集基础知识

目前FPGA用于图像采集 传输 处理 显示应用越来越多&#xff0c;主要原因是图像处理领域的火热以及FPGA强大的并行处理能力。本文以OV7725为例&#xff0c;对摄像头使用方面的基础知识做个小的总结&#xff0c;为后续做个铺垫。 XCLK:工作时钟输入&#xff0c;由主控器产生&…

FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

目录 前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作 SCCB时序特点 读写实现 OV7725寄存器常用配置参数 前言 摄像头采集是图像处理的第一步&#xff0c;本章节分为多部分&#xff0c;旨在让大家学会如何使用OV7725采集图像&#xff0c;并且…

【FPGA的基础快速入门22-------OV7725摄像头模块】

OV7725摄像头模块 OV7725是Omni Vision&#xff08;豪威科技&#xff09;公司生产的CMOS图像传感器&#xff0c;该传感器功耗低、可靠性高以及采集速率快&#xff0c;主要应用在玩具、安防监控、电脑多媒体等领域。 OV7725感光阵列达到640*480&#xff0c;能实现最快60fps VGA…

STM32 OV7725 传感器

目录 OV7725 传感器1、选择输出格式2、选择输出分辨率3、帧率调整4、夜间模式5、消除光带6、白平衡7、缺陷像素矫正8、黑电平矫正9、视频模式10、数字缩减 OV7725 函数1、光模式2、颜色饱和度3、亮度4、对比度5、特效 OV7725 设置参考 OV7725 传感器 OV7725摄像机™ 图像传感器…

OV7725摄像头之OV7725芯片

近日入手了一块正点原子家的OV7725摄像头模块&#xff0c;秉着小白尽可能学得透彻些的想法&#xff0c;选择了野火家的相同摄像头教学视频。链接如下&#xff1a;【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili 现…

二进制加法运算

两个二进制整数相加时&#xff0c;是位对位处理的&#xff0c;从最低的一对位&#xff08;右边&#xff09;开始&#xff0c;依序将每一对位进行加法运算。两个二进制数字相加&#xff0c;有四种结果&#xff0c;如下所示&#xff1a; 0 0 00 1 11 0 1 1 1 10 1 与 1 …

二进制加减法编程

1、二进制加法基本指令 &#xff08;1&#xff09;ADD指令 格式&#xff1a;ADD DST&#xff0c;SRC 该指令把源操作数&#xff08;SRC&#xff09;指向的数据与目的操作数&#xff08;DST&#xff09;相加后&#xff0c;将结果放到目的操作数&#xff08;DST&#xff09;中…

二进制乘除法运算原理

二进制乘除法原理 计算机所能完成的最基本操作是加减法和左右移。 虽然ISA中一般都有MUL类指令&#xff0c;但是这些经过译码之后最终的元操作还是加法和移位指令。 二进制乘法 假设不能使用乘除运算求ab的结果&#xff0c;当ab123时&#xff0c;最直接的方法是通过88个88相…

二进制加法计算

读计算机原理这本书的的时候涉及到二进制数的加法&#xff0c;个人做个直观的记录&#xff0c;防止遗忘。 计算时&#xff0c;先把两个二进制数对齐&#xff08;如同十进制一样&#xff0c; 从右向左&#xff09;11为10&#xff0c;此时向上一位进1,0写在本位&#xff08;如同十…

二进制加减乘除

最重要的,理解十进制的借位和进位.十进制中,由于一个循环是10,所以借1位,就相当于从高位借过来10,也就是常说的借1当10,同时,高位需要减去10(外在体现上是减去1,因为高位已经在高位了).反过来,进1,就等于高位加上10,但因为高位已经在高位了,所以去掉位数考虑,高位实际是加1,也就…

二进制加法

计算机中二进制相关运算 有符号二进制与无符号二进制数之间的区别有符号二进制加法运算讨论关于有符号二进制数算术的溢出问题&#xff08;重点&#xff09;无符号二进制运算 有符号二进制与无符号二进制数之间的区别 对于一个有符号二进制数来讲&#xff0c;最高位是该数的符…

二进制加减法计算

二进制加减法&#xff1a;原码、反码、补码 1.十进制下的计算1.模数2.补数 2.二进制数的存储1.计算机计数2.原码3.反码4.补码 3.二进制计算1.中位对称2.循环进位3.二进制减法推算4.结论 1.十进制下的计算 1.模数 假设下文【模】定义如下&#xff1a;某个可度量系统的度量范围…

二进制数的运算方法

1&#xff0e;二进制数的算术运算 二进制数的算术运算包括&#xff1a;加、减、乘、除四则运算&#xff0c;下面分别予以介绍。 &#xff08;1&#xff09;二进制数的加法 根据“逢二进一”规则&#xff0c;二进制数加法的法则为&#xff1a;0&#xff0b;0&#xff1d;00&…

简单计算二进制的加减法

二进制就是计算机技术中广泛采用的一种数制&#xff0c;由&#xff08;0&#xff0c;1&#xff09;组成。你可以广泛的认为&#xff0c;每一个 0&#xff0c;1 都&#xff08;存储在&#xff09;对应着一个比特位&#xff08;bit&#xff09;,而由这些由例如&#xff1a;010010…

二进制的加减乘除法全了看一下叭

看这里~ 前言一、二进制加法二、二进制减法三、二进制乘法四、二进制除法总结 前言 最近在学习通信网络中的CRC算法&#xff0c;所以积累一下二进制的各种算法&#xff0c;如果对您有用&#xff0c;记得点个赞喔&#xff01;谢谢啦。 一、二进制加法 对于二进制加法和十进制的…

二进制加,减法,23个位运算技巧

二进制加&#xff0c;减法 二进制最高位为1时表示负数&#xff0c;为0时表示正数。 **原码&#xff1a;**一个正数&#xff0c;转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 举例说明&#xff1a;       int类型的 …

二进制的加减法_二进制加减法

二进制的加减法 1)二进制加法 (1) Binary Addition) Since binary numbers consist of only two digits 0 and 1, so their addition is different from decimal addition. Addition of binary numbers can be done following certain rules: 由于二进制数仅由两位数字0和1组成…

补码二进制减法计算

二进制减法计算 -1 - 1 二进制表示为 -1 1 -2 补码1111 ... 1110 原码1000 ... 0010 如果是5 - 3 如果-12 如果Int_min - 1 127 此处是在Int的范围&#xff0c;所以在环内-1到了127 如果不在int范围中&#xff0c;在二进制中&#xff0c;结果就是-(int_min1)…

二进制减法图解

写在前面 二进制减法类似于十进制的减法&#xff0c;我们根据小学学过的十进制的减法来推出二进制减法如何进行运算。 十进制减法 例如74323-4756226761的运算。灰色部分为计算过程&#xff0c;绿色字为被减一得到的数&#xff0c;红色字为借一后得到的数。 在运算过程中&…

DenseNet简介

论文传送门&#xff1a;https://arxiv.org/pdf/1608.06993.pdf CNN模型的发展十分火热&#xff0c;自LeNet提出以来&#xff0c;涌现了一批优秀的CNN模型。 LeNet是CNN的开山之作&#xff0c;标志着CNN真正的提出。2012年AlexNet夺得ILSVRC2012的冠军&#xff0c;深度学习大火…