shanji 发表于 2016-12-12 19:11:27

分享个用STM32F429做的网络摄像头

本帖最后由 shanji 于 2019-3-11 09:30 编辑

先来看看硬件资源:   
   主控是STM32F429IG,1MB flash,256KB RAM;外扩32MB SDRAM,用于暂存camera 输出的JPEG数据和LCD显存,摄像头这块使用DCMI传输数据。

简单实现原理:
       以太网使用lwip,netconn API编程,这种编程方式相比RAW 比较简单,只是需要OS的支持;然后,板子当服务器,PC当客户端,当建立连接后,服务器将采集到的摄像头数据发送到客户端显示。


关键代码:

   系统(ucos_ii)中建立了两个任务,task1用来处理服务器的一些周期性任务,task2用来发送JPEG数据流。
/**
* @briefTCP服务器任务
* @param
* @retval None
*/
void TCP_Server_task(void *arg)
{
      err_t err=0;
      err_t recv_err;
      struct netconn *server_coon; //服务器连接

      struct netbuf *recvbuf;             //接收数据netbuf指针      
      struct pbuf *bufptr;         //pbuf数据缓冲区指针
      
      server_coon = netconn_new(NETCONN_TCP);               //创建一个TCP链接
      netconn_bind(server_coon,IP_ADDR_ANY,TCP_SERVER_PORT);//绑定端口
      netconn_listen(server_coon);                            //进入监听模式
      server_coon->recv_timeout = 10;                         //禁止阻塞线程 等待10ms
         
      while (1)   
      {
                  err = netconn_accept(server_coon,&client_conn);      //接收连接请求
                  //printf("\r\nerr=0x%x\r\n",err);
                if (err == ERR_OK)                                     //正确说明有客户端联入
                  {                                                
                        while(1)
                              {                              
                                        if((recv_err = netconn_recv(client_conn,&recvbuf)) == ERR_OK)          //接收到数据且正确
                                        {               
                                                bufptr=recvbuf->p;                                  //得到数据指针
                                                memcpy(Data_buff,bufptr->payload,bufptr->tot_len);//拷贝数据                                       
                                                Data_buff='\0';                        //加入结束符
                                                
                                                if(!memcmp(Data_buff,Video_Start,9))               //开始采集
                                                {                     
                                                      Video_flag=1;                                 //标志位值1
                                                      CamFrame=0;                                 //帧率清零
                                                      cam_start();                                 //开始采集
                                                      RTC_ITConfig(RTC_IT_WUT,ENABLE);
                                                }
                                                else if(!memcmp(Data_buff,Video_Stop,8))            //关闭采集
                                                {                     
                                                      Video_flag=0;                                     //标志位值0,自动采集完最后一帧,自动停止
                                                      RTC_ITConfig(RTC_IT_WUT,DISABLE);
                                                }
                                                
                                                netbuf_delete(recvbuf);                           //清除缓冲netbuf
                                        }
                                        else if(recv_err == ERR_CLSD)       //关闭连接
                                        {
                                                netconn_close(client_conn);   //关闭连接
                                                netconn_delete(client_conn);    //删除连接
                                                break;
                                        }
                              }
                              
                  }
      }
}

/*********************分割线*************************/

/**
* @brief发送数据任务
* @param
* @retval None
*/
void CAM_Send_task(void *arg)
{               
      u16len,i,temp;
      u8*ptr;
      u8   flag;
      
      while(1)
      {                              

                if(Buf_DoutPtr!=Buf_DinPtr)
                {
                        len=(*Buf_DoutPtr);                        
                        ptr=(u8 *)(Buf_DoutPtr+1);                  //指向CAMbuf
                        flag=0;
                        
                        for(i=0;i<len;i++)
                        {
                              if((ptr==0xFF)&&(ptr==0xD9))      //找数据尾
                              {
                                        ptr='\r';
                                        ptr='\n';
                                        temp=i+4;                               //有效数据长度
                                        flag=1;
                                        break;
                              }
                        }
                        if(flag)
                        {      
                              netconn_write(client_conn ,ptr,temp,NETCONN_COPY);//发送数据
                              CamFrame++;                                       //帧率+1
                        }
                        
                        Buf_DoutPtr+=BUFF_SIZE;                        
                        if(Buf_DoutPtr==Buf_EndPtr)Buf_DoutPtr=Buf_StartPtr;//到最后一个了
                                                          //回到开头                        
            }

                OSTimeDly(1);
      }
}

现象:

OV5642


OV2640


如果关注的人多的话,我就收拾收拾上位机的代码,发给你们玩玩。


http://player.youku.com/player.php/sid/XMTg2MTMzNTIyOA==/v.swf

视频失效点这里
帧率在15fps左右。

shanji 发表于 2019-2-20 11:33:03

本帖最后由 shanji 于 2019-2-20 11:34 编辑

有没有人会搞在网页上显示摄像头画面的,输入ip就能显示,我现在只会显示静态的图像。






shanji 发表于 2019-4-16 09:34:27

daodanjishui 发表于 2019-4-14 21:05
楼主技术不错啊,但是你这个项目也很复杂啊。

没有不难的,就是把jpg数据发出去,没有任何上层协议,看看你也会的。难一点的是这个https://www.stmcu.org.cn/module/forum/thread-620067-1-1.html

shanji 发表于 2017-2-25 16:24:18

这名比较叼 发表于 2017-2-24 09:02
请问楼主,你网口传输速度是多少呢?我现在用的udp通信,传输速度只有几百K,要是在系统上跑的话会不会快一 ...

没去统计过具体速度。速度慢,上系统也是差不多的,关键还是要找到慢的原因

daodanjishui 发表于 2019-5-11 12:23:07

shanji 发表于 2019-2-20 11:33
有没有人会搞在网页上显示摄像头画面的,输入ip就能显示,我现在只会显示静态的图像。




两个月以后真的被你做出摄像头视频显示了,人才啊!应该参考了mjpg-streamer工程

Paderboy 发表于 2016-12-12 19:20:47

:loveliness:多谢分享。。学习了。。。

jackten 发表于 2016-12-12 19:35:19

谢谢分享                        

Stm32McuLover 发表于 2016-12-12 19:35:33


多谢分享。。学习了。。。

leo121_3006061 发表于 2016-12-12 19:43:22

谢谢分享,学习:)

pythonworld 发表于 2016-12-12 20:09:04

谢谢分享,学习

netlhx 发表于 2016-12-12 21:29:51

赞赞赞,32个赞

jinglixixi 发表于 2016-12-13 08:23:56

多谢分享。

wyxy163@126.com 发表于 2016-12-13 08:34:06

小小超 发表于 2016-12-13 08:57:14

多谢分享。。学习了。。。

andypanfan 发表于 2016-12-13 09:05:12

多谢分享。。学习了。。。

斜阳 发表于 2016-12-13 09:17:51

谢谢分享

294479435@qq.co 发表于 2016-12-13 11:27:14

这个厉害了word哥

zhangxu56726 发表于 2016-12-13 14:56:52

我最近也在搞网络摄像头,能否分享下你的上位机软件呢,谢谢!

wolfgang 发表于 2016-12-13 15:03:45


赞赞赞,48个赞
页: [1] 2 3 4 5 6 7
查看完整版本: 分享个用STM32F429做的网络摄像头