注册 登录
查看: 12178|回复: 61

[摄像头组] 【山外摄像头】鹰眼上位机例程和微焦效果

[复制链接]
发表于 2014-9-24 10:38:46 | 显示全部楼层 |阅读模式
直接上拍摄 快递单好的字体效果:



这个是60度镜头,80*60效果


这个是60度镜头,320*240效果


90度镜头,320*240效果


上位机的例程,其实就是vcan_sendimg函数,先发送命令头,再发送数据,最后发送命令尾。

  1. uint8 imgbuff[CAMERA_SIZE];                             //定义存储接收图像的数组
  2. uint8 img[CAMERA_W*CAMERA_H];

  3. //函数声明
  4. void PORTA_IRQHandler();
  5. void DMA0_IRQHandler();
  6. void vcan_sendimg(uint8 *imgaddr, uint32 imgsize);

  7. /*!
  8. *  @brief      main函数
  9. *  @since      v5.0
  10. *  @note       野火摄像头 LCD 测试实验
  11. */
  12. void  main(void)
  13. {
  14.     Site_t site     = {0, 0};                           //显示图像左上角位置
  15.     Size_t imgsize  = {CAMERA_W, CAMERA_H};             //图像大小
  16.     Size_t size;                   //显示区域图像大小

  17.     gpio_init(PTA4,GPO,1);

  18.     LCD_init();
  19.     LCD_str            (site,"Cam init ing",FCOLOUR,BCOLOUR);

  20.     size.H = LCD_H;
  21.     size.W = LCD_W;

  22.     camera_init(imgbuff);

  23.     LCD_str            (site,"Cam init OK!",FCOLOUR,BCOLOUR);
  24.     //配置中断复位函数
  25.     set_vector_handler(PORTA_VECTORn , PORTA_IRQHandler);   //设置LPTMR的中断复位函数为 PORTA_IRQHandler
  26.     set_vector_handler(DMA0_VECTORn , DMA0_IRQHandler);     //设置LPTMR的中断复位函数为 PORTA_IRQHandler

  27.     while(1)
  28.     {
  29.         camera_get_img();                                   //摄像头获取图像

  30.         LCD_Img_Binary_Z(site, size, imgbuff, imgsize);     //黑白摄像头
  31.         vcan_sendimg(imgbuff,CAMERA_SIZE);
  32.     }
  33. }


  34. /*!
  35. *  @brief      PORTA中断服务函数
  36. *  @since      v5.0
  37. */
  38. void PORTA_IRQHandler()
  39. {
  40.     uint8  n;    //引脚号
  41.     uint32 flag;

  42.     while(!PORTA_ISFR);
  43.     flag = PORTA_ISFR;
  44.     PORTA_ISFR  = ~0;                                   //清中断标志位

  45.     n = 29;                                             //场中断
  46.     if(flag & (1 << n))                                 //PTA29触发中断
  47.     {
  48.         camera_vsync();
  49.     }
  50. }

  51. /*!
  52. *  @brief      DMA0中断服务函数
  53. *  @since      v5.0
  54. */
  55. void DMA0_IRQHandler()
  56. {
  57.     camera_dma();
  58. }

  59. //发送图像到上位机显示
  60. //不同的上位机,不同的命令
  61. //如果使用其他上位机,则需要修改代码
  62. void vcan_sendimg(uint8 *imgaddr, uint32 imgsize)
  63. {
  64. #define CMD_IMG     1
  65.     uint8 cmdf[2] = {CMD_IMG, ~CMD_IMG};    //山外上位机 使用的命令
  66.     uint8 cmdr[2] = {~CMD_IMG, CMD_IMG};    //山外上位机 使用的命令

  67.     uart_putbuff(VCAN_PORT, cmdf, sizeof(cmdf));    //先发送命令

  68.     uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像

  69.     uart_putbuff(VCAN_PORT, cmdr, sizeof(cmdr));    //先发送命令
  70. }


上位机下载:
【多功能调试助手V1.0】串口、摄像头、GSM... - 一天攻破K60 - 山外-vcan123论坛
http://vcan123.com/thread-5988-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2互助 +2 收起 理由
帅比凯 + 1 很给力!
九灵元圣 + 1 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2014-9-24 11:48:52 | 显示全部楼层
抢沙发~给哥们顶一个
回复 支持 反对

使用道具 举报

发表于 2014-9-24 12:17:01 | 显示全部楼层
机器视觉的前奏啊
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-25 21:31:19 | 显示全部楼层
鹰眼插在调试器上,灯不亮,怎么解决,下午还能用的,晚上就跪了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-25 22:42:14 | 显示全部楼层
小铭_z 发表于 2014-9-25 21:31
鹰眼插在调试器上,灯不亮,怎么解决,下午还能用的,晚上就跪了?

断电,测一下电源是否短路?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-1 22:09:45 | 显示全部楼层
上面不是lcd的么  鹰眼摄像头怎么改啊  为什么5.1的例程里面那个“DMA_鹰眼摄像头OV7725串口显示”程序烧进去v1.0的调试助手里面的串口可以接收数据 但智能车调试窗口却没有二值化图像啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-1 22:11:58 | 显示全部楼层
正凯36 发表于 2014-11-1 22:09
上面不是lcd的么  鹰眼摄像头怎么改啊  为什么5.1的例程里面那个“DMA_鹰眼摄像头OV7725串口显示”程序烧进 ...

“DMA_鹰眼摄像头OV7725串口显示”程序  用的是 YY上位机:
山外鹰眼上位机显示图像 - 智能车资料区 - 山外论坛 http://vcan123.com/forum.php?mod=viewthread&tid=77&ctid=6


我们这里的例程,用的 是我们自己编写的 多功能调试助手,因为多功能调试助手是后期发布的,所以之前发布的代码并没有用多功能调试助手。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-1 22:12:32 | 显示全部楼层
正凯36 发表于 2014-11-1 22:09
上面不是lcd的么  鹰眼摄像头怎么改啊  为什么5.1的例程里面那个“DMA_鹰眼摄像头OV7725串口显示”程序烧进 ...

你可以注释掉上面的LCD代码,不用LCD显示也行的。
回复 支持 反对

使用道具 举报

发表于 2014-11-1 22:14:13 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-1 22:11
“DMA_鹰眼摄像头OV7725串口显示”程序  用的是 YY上位机:
山外鹰眼上位机显示图像 - 智能车资料区 -  ...

哦哦 也就是我得用yy上位机  谢谢山外哥!

回复 支持 反对

使用道具 举报

发表于 2014-11-1 22:26:43 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-1 22:12
你可以注释掉上面的LCD代码,不用LCD显示也行的。

那个yy上位机的图像宽度和高度只能设置为80*60么?
回复 支持 反对

使用道具 举报

发表于 2014-11-1 22:27:20 | 显示全部楼层
正凯36 发表于 2014-11-1 22:26
那个yy上位机的图像宽度和高度只能设置为80*60么?

必须要跟单片机程序里配置的相同,才可以显示正确。
回复 支持 反对

使用道具 举报

发表于 2014-11-1 22:27:36 | 显示全部楼层
我如果用多功能调试助手要怎么改代码啊?
回复 支持 反对

使用道具 举报

发表于 2014-11-1 23:24:30 | 显示全部楼层
正凯36 发表于 2014-11-1 22:27
我如果用多功能调试助手要怎么改代码啊?

楼主贴的代码就是了,换一下 main.c 文件的内容
回复 支持 反对

使用道具 举报

发表于 2014-11-3 13:40:49 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-1 22:12
你可以注释掉上面的LCD代码,不用LCD显示也行的。

这样改可以么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-11-3 13:42:33 | 显示全部楼层

这个是上位机的代码啊,你可以改串口端口或者发送的串口函数,但发送的数据不能改,改了就不能跟上位机通信。
回复 支持 反对

使用道具 举报

发表于 2014-11-3 20:03:11 | 显示全部楼层
单会 发表于 2014-11-3 13:42
这个是上位机的代码啊,你可以改串口端口或者发送的串口函数,但发送的数据不能改,改了就不能跟上位机通 ...

发送的串口函数怎么改才能与多功能调试助手通信啊?上面贴出来得代码没有啊,原来的鹰眼代码只能在yy上位机上显示二值化的图像,可要是在多功能调试助手上显示二值化图像,到底应该该哪里啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-3 20:05:54 | 显示全部楼层
正凯36 发表于 2014-11-3 20:03
发送的串口函数怎么改才能与多功能调试助手通信啊?上面贴出来得代码没有啊,原来的鹰眼代码只能在yy上位 ...

楼主位不是有代码了吗?用上面的代码显示不了吗?
回复 支持 反对

使用道具 举报

发表于 2014-11-3 20:08:43 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-3 20:05
楼主位不是有代码了吗?用上面的代码显示不了吗?

#include "common.h"
#include "include.h"
#include "math.h"
uint8 imgbuff[CAMERA_SIZE];                             //定义存储接收图像的数组[图像占用空间大小]
uint8 img[CAMERA_W*CAMERA_H];                           //由于鹰眼摄像头是一字节8个像素,因而需要解压为 1字节1个像素,方便处理
//函数声明
void sendimg(uint8 *imgaddr, uint32 imgsize);          //发送图像到上位机
void img_extract(uint8 *dst, uint8 *src, uint32 srclen);//提取图像二值化图像解压
void PORTA_IRQHandler();//PORTA中断服务函数
void DMA0_IRQHandler();//DMA0中断服务函数
/*!
*  @brief      main函数
*  @since      v5.0
*  @note       山外 DMA 采集摄像头 实验
                注意,此例程 bus频率设为100MHz(50MHz bus频率会太慢而导致没法及时采集图像)
*/
void  main(void)
{
    //初始化摄像头
    camera_init(imgbuff);
    //配置中断复位函数
    set_vector_handler(PORTA_VECTORn ,PORTA_IRQHandler);    //设置LPTMR的中断复位函数为 PORTA_IRQHandler
    set_vector_handler(DMA0_VECTORn ,DMA0_IRQHandler);      //设置LPTMR的中断复位函数为 PORTA_IRQHandler
    while(1)
    {
        //获取图像
        camera_get_img();                                   //摄像头获取图像
        //解压图像
        img_extract(img, imgbuff,CAMERA_SIZE);
        //发送图像到上位机
        sendimg(img, CAMERA_W * CAMERA_H);                  //发送到上位机
    }
}
/*!
*  @brief      发送图像到eSmartCameraCar上位机显示
*  @param      imgaddr         图像地址
*  @param      imgsize         图像占用空间大小
*  @since      v5.0
*  @note       不同的上位机,不同的命令,这里使用 eSmartCameraCar软件,
                如果使用其他上位机,则需要修改代码。
*  Sample usage:   sendimg(imgbuff, CAMERA_W * CAMERA_H);                    //发送到上位机
*/
void sendimg(uint8 *imgaddr, uint32 imgsize)
{
  // uint8 cmd[4] = {0, 255, 1, 0 };    //yy_摄像头串口调试 使用的命令
  uint8 cmdf[2] = {0,1};
  uint8 cmdr[2]={1,0};
    uart_putbuff(VCAN_PORT, cmdf, sizeof(cmdf));    //先发送命令
    uart_putbuff(VCAN_PORT, imgaddr, imgsize); //再发送图像
    uart_putbuff(VCAN_PORT,cmdr,sizeof(cmdr));
}
/*!
*  @brief      二值化图像解压(空间 换 时间 解压)
*  @param      dst             图像解压目的地址
*  @param      src             图像解压源地址
*  @param      srclen          二值化图像的占用空间大小
*  @since      v5.0            img_extract(img, imgbuff,CAMERA_SIZE);
*  Sample usage:   sendimg(imgbuff, CAMERA_W * CAMERA_H);                    //发送到上位机
*/
void img_extract(uint8 *dst, uint8 *src, uint32 srclen)
{
    uint8 colour[2] = {1, 0}; //0 和 1 分别对应的颜色
    //注:山外的摄像头 0 表示 白色,1表示 黑色
    uint8 tmpsrc;
    while(srclen --)
    {
        tmpsrc = *src++;
        *dst++ = colour[ (tmpsrc >> 7 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 6 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 5 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 4 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 3 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 2 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 1 ) & 0x01 ];
        *dst++ = colour[ (tmpsrc >> 0 ) & 0x01 ];
    }
}
/*!
*  @brief      PORTA中断服务函数
*  @since      v5.0
*/
void PORTA_IRQHandler()
{
    uint8  n = 0;    //引脚号
    uint32 flag = PORTA_ISFR;
    PORTA_ISFR  = ~0;                                   //清中断标志位
    n = 29;                                             //场中断
    if(flag & (1 << n))                                 //PTA29触发中断
    {
        camera_vsync();
    }
#if 0             //鹰眼直接全速采集,不需要行中断
    n = 28;
    if(flag & (1 << n))                                 //PTA28触发中断
    {
        camera_href();
    }
#endif
}
/*!
*  @brief      DMA0中断服务函数
*  @since      v5.0
*/
void DMA0_IRQHandler()
{
    camera_dma();
}
回复 支持 反对

使用道具 举报

发表于 2014-11-3 20:10:50 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-3 20:05
楼主位不是有代码了吗?用上面的代码显示不了吗?

这样写为什么不能在多功能调试助手上显示啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-3 20:13:09 | 显示全部楼层
正凯36 发表于 2014-11-3 20:10
这样写为什么不能在多功能调试助手上显示啊?

不需要解压,直接把采集的数据发送出去即可。你自己用我们楼主贴的代码,不要只用一小部分。
回复 支持 反对

使用道具 举报

发表于 2014-11-26 14:50:55 | 显示全部楼层
向大神,学习
回复 支持 反对

使用道具 举报

发表于 2014-12-31 17:47:23 | 显示全部楼层
山哥,我直接复制粘贴怎么还是不行,还有我用/30.DMA_CAMERA_鹰眼摄像头采集_多功能调试助手上位机显示/例程显示的画面看不清,就是一块块黑斑,求教!!!山外哥
回复 支持 反对

使用道具 举报

发表于 2014-12-31 19:19:31 | 显示全部楼层
Tom是只狗 发表于 2014-12-31 17:47
山哥,我直接复制粘贴怎么还是不行,还有我用/30.DMA_CAMERA_鹰眼摄像头采集_多功能调试助手上位机显示/例 ...

是否没 调焦?
回复 支持 反对

使用道具 举报

发表于 2014-12-31 20:41:03 | 显示全部楼层

恩,就是没调焦。但出来的画面没山外兄的清楚,大概能看清
回复 支持 反对

使用道具 举报

发表于 2015-1-2 19:49:58 | 显示全部楼层
山哥,我用/30.DMA_CAMERA_鹰眼摄像头采集_多功能调试助手上位机显示/例程里的程序显示出来的为什么没你的这么清楚,我是用多功能调试助手,你这下面的程序用了不行
回复 支持 反对

使用道具 举报

发表于 2015-1-23 20:01:17 | 显示全部楼层
uart_putbuff(VCAN_PORT, cmdr, sizeof(cmdr));    //先发送命令
这个VCAN_PORT在哪里定义的 ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-23 20:21:48 | 显示全部楼层
cyyvyvyvy 发表于 2015-1-23 20:01
uart_putbuff(VCAN_PORT, cmdr, sizeof(cmdr));    //先发送命令
这个VCAN_PORT在哪里定义的 ?

这个是串口端口,是个宏定义,例如配置UART3
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-2-3 12:29:58 | 显示全部楼层
山外哥,你的这个例程用了场中断,应该一次传输DMA_NUM为W还是W*H?还是W*H/8

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-2-6 14:20:24 | 显示全部楼层
山外哥,80*60的分辨率看到图像有锯齿,这个对后面的算法影响大吗?你推荐使用80*60,为什么不用大一点的分辨率,图像看到更光滑?
回复 支持 反对

使用道具 举报

发表于 2015-3-25 18:29:42 | 显示全部楼层
你那里有野火鹰眼的例程吗,麻烦你发给我试一试
回复 支持 反对

使用道具 举报

发表于 2015-3-28 10:40:08 | 显示全部楼层
山外大神 例程里面这句话是干啥的?
gpio_init(PTA4,GPO,1);
这句话没有在其他摄像头采集、液晶屏显示的程序里面见到
我把它注释掉也不影响显示和通讯......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-28 10:41:33 | 显示全部楼层
禁了nmi中断
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-3-28 11:13:22 | 显示全部楼层

nmi中断是什么......才疏学浅不太明白 大神可否告知?
回复 支持 反对

使用道具 举报

发表于 2015-3-29 10:42:21 | 显示全部楼层
用该程序可以在上位机显示二值化图像
可是用V5.2的LCD_摄像头的例程
发送的函数为如下:
img_extract(img, imgbuff, CAMERA_SIZE);          //解压为灰度图像,方便发送到上位机显
sendimg(img, CAMERA_W * CAMERA_H);                    //发送到上位机
串口用16位格式显示 都是00或FF
但是在二值化显示、灰度显示中都没有对应的图像 这是为什么呢?
串口图像显示的工具为山外多功能调试助手1.1.1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-29 11:19:51 | 显示全部楼层
tintinshine 发表于 2015-3-29 10:42
用该程序可以在上位机显示二值化图像
可是用V5.2的LCD_摄像头的例程
发送的函数为如下:

发送函数就是楼主帖的吗?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-4-11 19:13:35 | 显示全部楼层
main.c是一样的,用的也是你提供的上位机,为什么看不到图像,提醒一下还有哪些地方可能我忽略的
回复 支持 反对

使用道具 举报

发表于 2015-4-15 18:16:37 | 显示全部楼层
结合山外大神的帖子“鹰眼图像解压,转为 二维数组”http://www.vcan123.com/forum.php ... &extra=page%3D1
感觉有点看晕乎了
是不是该例程中的vcan_sendimg函数是直接把采集回来的图像发给了山外调试助手而没有经过图像解压?
但是直接16进制显示貌似又都是00跟FF.......
如果按照山外大神“鹰眼图像解压,转为 二维数组”的帖子来修改该程序 是不是要把
uint8 img[CAMERA_W*CAMERA_H];改成uint8 img[CAMERA_W][CAMERA_H];
然后调用的时候使用:img_extract((uint8 *)img, (uint8 *)imgbuff, CAMERA_SIZE);强制转换
最后数组img[CAMERA_W][CAMERA_H]里面就是转换好的图像的二维数组了?
请山外大神明示.........T_T
回复 支持 反对

使用道具 举报

发表于 2015-4-16 20:27:13 | 显示全部楼层
山外哥用鹰眼采集图像,怎么改成一场有140*80个点?
回复 支持 反对

使用道具 举报

发表于 2015-4-27 22:37:59 | 显示全部楼层
山外哥,我想用uart4传图像到上位机,只改vcan_uart那里的uart3为uart4,可是不行,用的是最新的库,还需要改什么吗?。
回复 支持 反对

使用道具 举报

发表于 2015-5-15 21:57:12 | 显示全部楼层
Fri May 15, 2015 22:03:16: The flash loader program reported an error.
山外哥:这是不是芯片锁上了?怎么解?你们的参考例程烧不进去,我是用K60DN512
回复 支持 反对

使用道具 举报

发表于 2015-7-2 16:52:28 | 显示全部楼层
火哥,串口提示错误,换了鹰眼摄像头之后,卡死在sccb中,求解啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-10-22 12:05:08 | 显示全部楼层

回复 支持 反对

使用道具 举报

发表于 2015-11-1 20:37:13 | 显示全部楼层
楼主,我想问一下为啥我的摄像头例程下不到单片机里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-1 22:52:34 | 显示全部楼层
2240090869 发表于 2015-11-1 20:37
楼主,我想问一下为啥我的摄像头例程下不到单片机里

解锁看看,芯片型号是否一致
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-11-2 20:43:47 | 显示全部楼层
山外メ雲ジ 发表于 2015-11-1 22:52
解锁看看,芯片型号是否一致

现在程序已经能下进去了,然而usb转ttl接入电脑上,用串口调试助手却看不到摄像头的图像 ,这是怎么回事呀
回复 支持 反对

使用道具 举报

发表于 2015-11-3 01:24:26 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

发表于 2015-11-6 14:07:46 | 显示全部楼层
有配套的单片机?
回复 支持 反对

使用道具 举报

发表于 2015-11-13 15:15:33 | 显示全部楼层
山外哥,我想问下,1.这个程序是不是也可以直接在LCD显示呢?(LCD_Img_Binary_Z(site, size, imgbuff, imgsize);这个函数就是LCD显示的函数吧?)
2. camera_get_img();      这是采集的函数,那么解压的函数呢?不太明白解压。。。



回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-13 15:18:39 | 显示全部楼层
我小时候可白呢 发表于 2015-11-13 15:15
山外哥,我想问下,1.这个程序是不是也可以直接在LCD显示呢?(LCD_Img_Binary_Z(site, size, imgbuff, img ...

可以直接在lcd 上显示。

解压函数,例程里应该有啊
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-11-23 17:08:43 | 显示全部楼层
为什么一改摄像头宽度80*60   显示的图像就很卡     求回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部