大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
OV7725鹰眼摄像头如何使用?
目前的ov7725鹰眼摄像头,基本上用的都是山外的库,所以今天我们主要根据山外的库,基于k60芯片,给大家具体的讲解。
1.摄像头初始化
首先是摄像头的第一步就是初始化,这个我们直接去调用就行!
camera_init(imgbuff);
当然小伙伴在这里需要记住,需要配置中断优先级!对于我们使用摄像头的车而言,一般优先级最高的就是摄像头,所以小伙伴要记着给它分配优先级!我这里是分了五个优先级!大家也可以根据自己的需求,进行自主分配。
NVIC_SetPriorityGrouping(5); //设置优先级分组,4bit 抢占优先级,没有亚优先级
NVIC_SetPriority(PORTA_IRQn,0); //配置优先级 摄像头
NVIC_SetPriority(DMA0_IRQn,1); //配置优先级 摄像头DMA
NVIC_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等一些屏幕来实时观看,在这里给大家看一下我准备的几张赛道图像。
这就是一些基本的赛道图像,在这里我是通过上位机来观看的。小伙伴也可以通过屏幕里观看,这样就更加直接方便。
**
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,所以为了能够等比缩放,把图像给压缩了,但是实际效果并不是很影响,如果你用的屏幕分辨率较高,完全可以不用考虑这一点。
如果完成这三步,那我们最基础的摄像头采集和显示就完成,至于后续的图像处理和阳光算法,我也会慢慢给大家讲解。感兴趣的小伙伴可以看后续的文章。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190272.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...