• linux下视频传输测试


    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

    在上一篇《ubuntu下基于qt+OpenCV控制摄像头》的基础上测试了视频传输.

    环境:主机:PC + Ubuntu10.04 + OpenCV + Qt

          从机:s3c6410 + linux2.6.38 + Qt

    主机有摄像头,捕捉摄像头,然后通过网络传输,从机接收数据后显示。

    实现流程:

    主机代码:

    主要代码如下,socket编程采用Linux本身提供的方法。

    widget.h

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:'Arial Black';">#ifndef WIDGET_H  
    2. #define WIDGET_H  
    3.   
    4. #include <QWidget>  
    5. #include "public.h"  
    6.   
    7. namespace Ui {  
    8.     class Widget;  
    9. }  
    10.   
    11. class Widget : public QWidget  
    12. {  
    13.     Q_OBJECT  
    14.   
    15. public:  
    16.     explicit Widget(QWidget *parent = 0);  
    17.     ~Widget();  
    18.   
    19. private:  
    20.     Ui::Widget *ui;  
    21.   
    22.     CvCapture *capture;             //视频数据结构  
    23.     IplImage *frame;  
    24.     QTimer *timer;  
    25.     QImage *img;  
    26.   
    27. private slots:  
    28.     void slot_timer();  
    29.   
    30. protected:  
    31.     void paintEvent (QPaintEvent *);  
    32. };  
    33.   
    34. #endif // WIDGET_H  
    35. </span>  


    widget.c

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:'Arial Black';">#include "widget.h"  
    2. #include "ui_widget.h"  
    3. #include "public.h"  
    4.   
    5. Widget::Widget(QWidget *parent) :  
    6.     QWidget(parent),  
    7.     ui(new Ui::Widget)  
    8. {  
    9.     ui->setupUi(this);  
    10.   
    11.     timer = new QTimer(this);  
    12.     connect(timer,SIGNAL(timeout()),this,SLOT(slot_timer()));  
    13.     timer->start(FPS);  
    14.   
    15.     capture = cvCreateCameraCapture(0);  
    16.     //cvNamedWindow("jdh",CV_WINDOW_AUTOSIZE);  
    17.   
    18.     //初始化网络  
    19.     init_sockaddr_in(&Dst_Addr,Udp_Port,QString(DST_IP));  
    20.     //套接字初始化  
    21.     Socket_Send = socket(AF_INET,SOCK_DGRAM,0);  
    22.   
    23.     //img = new QImage("test.jpg");  
    24.     //img->save("test_save.png","PNG",0);  
    25.     //img->save("test_save.jpeg","JPEG",10);  
    26. }  
    27.   
    28. void Widget::slot_timer()  
    29. {  
    30.     frame = cvQueryFrame(capture);  
    31.     if (!frame)  
    32.     {  
    33.         return;  
    34.     }  
    35.   
    36.     //img->load("test.jpg");  
    37.     cvCvtColor(frame,frame,CV_BGR2RGB);  
    38.     img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,frame->widthStep,QImage::Format_RGB888);  
    39.     //img = new QImage((unsigned char*)frame->imageData,frame->width,frame->height,QImage::Format_RGB888);  
    40.     update();  
    41.     //cvShowImage("jdh",frame);  
    42.   
    43.     img->save("test_save.jpeg","JPEG",ZHILIANG);  
    44.     QFile file("test_save.jpeg");  
    45.     if (!file.open(QIODevice::ReadOnly))  
    46.              return;  
    47.     QByteArray buffer = file.readAll();  
    48.   
    49.     if (sendto(Socket_Send,buffer.data(),buffer.size(),0,(struct sockaddr *)(&Dst_Addr),sizeof(struct sockaddr_in)) 0)  
    50.     {  
    51.         cout << "send fail" << " " <buffer.size() <endl;  
    52.         perror("hello");  
    53.     }  
    54.     file.close();  
    55.   
    56.     //网络发送  
    57.     /*  
    58.     if (sendto(Socket_Send,img->data_ptr(),img->byteCount(),0,(struct sockaddr *)(&Dst_Addr),sizeof(struct sockaddr_in)) 0)  
    59.     {  
    60.         cout << "send fail" << " " <frame->width << " " <frame->height << " " <img->byteCount() <endl;  
    61.         perror("hello");  
    62.     }  
    63.     */  
    64. }  
    65.   
    66. void Widget::paintEvent(QPaintEvent * event)  
    67. {  
    68.     //painter->drawImage(0,0,mm);  
    69.     QPainter *pp = new QPainter(this);  
    70.     pp->drawImage(0,0,*img);  
    71. }  
    72.   
    73. Widget::~Widget()  
    74. {  
    75.     delete ui;  
    76.   
    77.     cvReleaseImage(&frame);  
    78.     //cvDestroyWindow("jdh");  
    79. }  
    80. </span>  

    从机主要代码如下,socket编程采用qt里机制

    widget.h

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:'Arial Black';">#ifndef WIDGET_H  
    2. #define WIDGET_H  
    3.   
    4. #include <QWidget>  
    5. #include "public.h"  
    6.   
    7. namespace Ui {  
    8.     class Widget;  
    9. }  
    10.   
    11. class Widget : public QWidget  
    12. {  
    13.     Q_OBJECT  
    14.   
    15. public:  
    16.     explicit Widget(QWidget *parent = 0);  
    17.     ~Widget();  
    18.   
    19. private:  
    20.     Ui::Widget *ui;  
    21.   
    22.     QImage *img;  
    23.   
    24.     QUdpSocket *receiver;  
    25. protected:  
    26.     void paintEvent(QPaintEvent *);  
    27.   
    28. private slots:  
    29.     void processPendingDatagram();  
    30. };  
    31.   
    32. #endif // WIDGET_H  
    33. </span>  


    widget.c

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:'Arial Black';">#include "widget.h"  
    2. #include "ui_widget.h"  
    3.   
    4. Widget::Widget(QWidget *parent) :  
    5.     QWidget(parent),  
    6.     ui(new Ui::Widget)  
    7. {  
    8.     ui->setupUi(this);  
    9.   
    10.     receiver = new QUdpSocket(this);  
    11.     receiver->bind(Udp_Port,QUdpSocket::ShareAddress);  
    12.     connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));  
    13. }  
    14.   
    15. void Widget::paintEvent(QPaintEvent *)  
    16. {  
    17.     QPainter *pp = new QPainter(this);  
    18.     pp->drawImage(0,0,*img);  
    19. }  
    20.   
    21. void Widget::processPendingDatagram()  
    22. {  
    23.     qint64 num = receiver->pendingDatagramSize();  
    24.     cout << "receive size = " << num << endl;  
    25.   
    26.     QByteArray buffer;  
    27.     buffer.resize(num);  
    28.     receiver->readDatagram((char *)buffer.data(),num);  
    29.   
    30.     QFile file("test_save.jpeg");  
    31.     if (!file.open(QIODevice::WriteOnly))  
    32.              return;  
    33.     file.write(buffer);  
    34.     file.close();  
    35.     img = new QImage("test_save.jpeg");  
    36.     update();  
    37.   
    38. }  
    39.   
    40. Widget::~Widget()  
    41. {  
    42.     delete ui;  
    43. }  
    44. </span>  

    从机端显示:

     

    http://blog.csdn.net/jdh99/article/details/6672481

  • 相关阅读:
    作业插入一个数值,按顺序排列
    元旦作业输入一批数字求最大最小值,用户输入一位整数,显示对应英文星期缩写,筛子游戏完善
    2018/12/29测试题
    JAVA循环的语法
    课后作业机票,赌骰子游戏,switch的使用实例
    Cadence之双击(DSN/brd)文件打开变新建文件的解决方法
    STemwin替换为MDK下的emwin
    Orcad原理图封装库批量编辑引脚时需要配合Excel进行制作时候需要操作(遇到无法复制粘贴操作)
    偶遇STM32 JTAG和SWD口(调试)被禁用无法下载,已经粗暴解决!
    Altium Designer之AD16在Win10系统下无法切换走线/布线模式的解决办法
  • 原文地址:https://www.cnblogs.com/findumars/p/6152876.html
Copyright © 2020-2023  润新知