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

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

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

从机:s3c6410 + linux2.6.38 + Qt

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

实现流程:

主机代码:

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

widget.h

  1. <span style="font-family:'Arial Black';">#ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include "public.h"
  5. namespace Ui {
  6. class Widget;
  7. }
  8. class Widget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Widget(QWidget *parent = 0);
  13. ~Widget();
  14. private:
  15. Ui::Widget *ui;
  16. CvCapture *capture;             //视频数据结构
  17. IplImage *frame;
  18. QTimer *timer;
  19. QImage *img;
  20. private slots:
  21. void slot_timer();
  22. protected:
  23. void paintEvent (QPaintEvent *);
  24. };
  25. #endif // WIDGET_H
  26. </span>

widget.c

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

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

widget.h

  1. <span style="font-family:'Arial Black';">#ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include "public.h"
  5. namespace Ui {
  6. class Widget;
  7. }
  8. class Widget : public QWidget
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Widget(QWidget *parent = 0);
  13. ~Widget();
  14. private:
  15. Ui::Widget *ui;
  16. QImage *img;
  17. QUdpSocket *receiver;
  18. protected:
  19. void paintEvent(QPaintEvent *);
  20. private slots:
  21. void processPendingDatagram();
  22. };
  23. #endif // WIDGET_H
  24. </span>

widget.c

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

从机端显示:

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

linux下视频传输测试的更多相关文章

  1. RedHat Linux 下安装、测试摄像头

    RedHat Linux 下安装.测试摄像头(全文见附件)     随着视频电话的迅速发展我相信大家一定有过在Windows 下安装摄像头的经历,然而大多数 都不支持Linux .我现以罗技摄像头为例 ...

  2. linux下视频转gif

    title: linux下视频转gif date: 2017-11-23 16:55:26 tags: linux categories: linux 安装ffmpeg ffmpeg是一套非常强大的音 ...

  3. linux 下网站压力测试工具webbench

    一直在用webbench ,这个linux下的网站压力测试工具.整理下. 笔记本装的ubuntu,其他linux系统也差不多. webbench 需要先安装 ctags,一个vim的阅读插件,可以直接 ...

  4. Linux下的压力测试工具:ab、http_load、webbench、siege

    一.ab 1.1 介绍 ab是apache自带的一款功能强大的测试工具.      安装了apache一般就自带了. 1.2 下载 同apache. 1.3 安装 同apache. 1.4 安装结果 ...

  5. USB3.0之高速视频传输测试 双目相机(mt9p031、mt9m001)带宽高达300M测试 配合isensor测试 500万像素15fps

    最近完善了下USB3.0的视频开发测试,主要优化了FPGA程序和固件,及其同步方式.对带宽和图像效果进行了仔细的测试 开发板架构(2CMOS+FPGA+2DDR2+USB3.0) 评估板底板配合2个M ...

  6. linux下web压力测试工具ab使用及详解

    APACHE自带的测试工具AB(apache benchmark).在APACHE的bin目录下.格式: ./ab [options] [http://]hostname[:port]/path参数: ...

  7. Linux下视频转换工具:转换,切割,连接,

    首先当然是需要安装ffmpeg软件包,可以直接从源中进行安装!但我安装后并不能成功执行后面所需要执行的转换命令,所以我只能重新从源码编译安装ffmpeg: (1)下载ffmpeg源码包,注意版本不能太 ...

  8. linux下libreoffice安装测试

    一.Linux安装 wget http://download.documentfoundation.org/libreoffice/stable/4.4.6/rpm/x86_64/LibreOffic ...

  9. linux下文件传输一些方法整理.

    ftp类 ftp 命令已经不推荐使用了. #基本用法 lftp sftp://[domain name] lftp sftp://theURL.org #使用不同用户名 lftp sftp://[us ...

随机推荐

  1. Android 4.0新增Space及GridLayout初谈

    Android 4.0的SDK已经发布,在众多的新增特性中,其中对开发者来说比较重要的特性之一,是新增的两种界面布局方式:Space和Gridlayout,它们跟以往Android版本的sdk有什么不 ...

  2. 新世界PT850/PT853检查用友机对接T1交易宝

    新世界PT850/PT853检查用友机对接T1交易宝 这是一个老话题.简单.条形码号码模式是没有必要说,我要说的是,,启用条码扫描.显示有关信息. 并能够产生:条码 , 数量,价格格 这样做的目的.将 ...

  3. C#进程创建监控

    关于c#进程创建监控的文章大多都是“遍历一次进程用if去判断存在或否”这样的方法,我觉得体验不是很好.这几天写的一个软件正好需要实时监控进程创建的模块,在网上找到了很不错的方法,整理一下分享出来给大家 ...

  4. 离散时间信号常见函数的实现(matlab)

    1. 单位样本序列 δ(n−n0)={1,n=n00,n≠n0 function [x, n] = impseq(n0, n1, n2) n = n1:n2; x = [n == n0]; 2. 单位 ...

  5. OpenGL(十六) 鼠标、键盘交互响应事件

    OpenGL中通过鼠标和键盘跟程序交互的实现需要实现注册鼠标和键盘响应事件,在一定条件下,该事件被触发,事件里的程序被执行,达到交互的目的. 通过glutMouseFunc(&OnMouse) ...

  6. MIS的趋势必定是围绕机器取代人手,分工越来越细(小餐厅都支持微信自助点餐,结账时就打个折,相当于省了1、2个人手,SQL发明以后,程序员的工作更多了)

    最后,我还想简略的谈谈MIS及MIS快速开发工具的未来. MIS的趋势必定是围绕机器取代人手,分工越来越细.比如:现在有些小型的咖啡厅里的财务子系统就简单到不需要使用者有会计知识,相当于省了会计人手: ...

  7. Go 语言如果按这样改进,能不能火过 Java?

    据 InfoWorld 消息,为改进 Go 语言的开发工具,Go 可能会获得自己的语言服务器,类似于 Microsoft 和 Red Hat 的语言服务器协议. 消息是从 Go 语言开发者的讨论组中流 ...

  8. DB First EF中的存储过程、函数、视图

    视图约等于表(属性)存储过程变为方法,方法中调用存储过程 EF可以调用存储过程,DB First的流程是刷新模型,获取存储过程,调用参考:http://blog.csdn.net/sudazf/art ...

  9. C# XML 去xmlns:xsd和xmlns:xsi属性

    public static XElement WithoutNamespaces(this XElement element) { if (element == null) return null; ...

  10. 【Git】生成Patch和使用Patch

    1.生成Patch(俗称快照) 先来看看repo manifest 的用法 <1>cd /工作目录/项目目录/.repo/manifests <2>repo manifest ...