【米尔FZ3深度学习计算卡试用体验】UDP读取摄像头图像缓存并动态显示
前文再续书接上一回,UDP缓存方式传输摄像头图像这个Demo是我在上一帖之前就已经完成的,无奈传输效果实在不如UDP传输文件,差太多了,所以只上传代码部分抛砖引玉让论坛大佬批评指导一下,UDP传输图片缓存有以下要点:
第一,每切片单位传输的数据一定要取一个平衡值,而且是有范围限制的,一般是1024~20480不等,传输数据量太小的话时间长,传输数据量太大的话会因响应超时导致图片断层;
第二,实际项目中使用这个方式传输图片一定要加帧同步机制,不管是在开发板端还是在QT上位机端,至少一个地方要加,不然会造成图片撕裂甚至是一片空白。
- int main(int argc, char* argv[])
- {
- V4L2_Init(CAMERA_DEV);
- int udp_socket_fd = socket(AF_INET,SOCK_DGRAM,0);
- if(udp_socket_fd < 0 )
- {
- perror("creat socket failn");
- return -1;
- }
- struct sockaddr_in local_addr = {0};
- local_addr.sin_family = AF_INET;
- local_addr.sin_port = htons(UDP_RECV_PORT);
- local_addr.sin_addr.s_addr = INADDR_ANY;
- int ret = bind(udp_socket_fd,(struct sockaddr*)&local_addr,sizeof(local_addr));
- if(ret < 0)
- {
- perror("bind fail:");
- close(udp_socket_fd);
- return -1;
- }
- //pthread_t recv_thread;
- //pthread_create(&recv_thread, NULL, recv_msg, (void*)&udp_socket_fd);
- struct sockaddr_in dest_addr = {0};
- dest_addr.sin_family = AF_INET;
-
- char msg[BUF_SIZE] = {0};
- dest_addr.sin_addr.s_addr = inet_addr(UDP_IP);
- //设置接收方IP
- dest_addr.sin_port = htons(UDP_SEND_PORT);
- //设置接收方端口号
- int i=0,j=0;
- static int flag=0;
- while(1)
- {
- if(flag == 0)
- {
- flag = 1;
- V4l2_Grab();
- Yuyv_2_RGB888(buffers,frame_buffer);
- }
- //Encode_Jpeg(frame_buffer,640,480,"1.jpg");
- // printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%xn",
- // frame_buffer[0],
- // frame_buffer[1],
- // frame_buffer[2],
- // frame_buffer[3],
- // frame_buffer[4],
- // frame_buffer[5]
- // );
- msg[0]=0x01;
- msg[1]=0xfe;
- msg[2]=0x02;
- msg[3]=0xfd;
- msg[6]=0x02;
- msg[7]=0xfd;
- msg[19208]=0x03;
- msg[19209]=0xfc;
- msg[19210]=0x04;
- msg[19211]=0xfb;
- for(j=0;j<10;j++)
- {
- msg[4] = j;
- msg[5] = 255-j;
- for(i=0;i<19200;i++)
- msg[i+8] = frame_buffer[i+j*19200];
- sendto(udp_socket_fd, msg, strlen(msg), 0, (struct sockaddr *)&dest_addr,sizeof(dest_addr));
- }
- }
- return 0;
- }
复制代码
|