分享

内存IplImage图像链队列实现

 工厂应用 2018-05-24

原文地址

从海康威视IPCamera摄像头里面采集到IplImage图像后,还需要与我的图像处理工程合并(一开始我是读文件的),想到的方法是使用链队列作为共享内容,然后一个线程负责采集图像,另一个线程负责处理图像。当然这两个线程的速度肯定是不匹配的,这个时候就需要自己处理一下,丢帧或者等待都可以。

另外在将图像存入链队列和从链队列里面取图像的时候都是临界区,我用的是互斥量处理的。

filename: Queue.h

  1. /********************************************************************************************************* 
  2. *由于图片生成后都是放在内存里面的,而且中间不会进行什么插入、删除操作,所以链队列是最好的选择。 
  3. *构建一个存放图片的链队列 
  4. *********************************************************************************************************/  
  5. #ifndef __Queue_H__  
  6. #define __Queue_H__  
  7.   
  8.   
  9. #include <iostream>  
  10. #include "cv.h"  
  11. #include "highgui.h"  
  12.   
  13. using namespace std;  
  14. using namespace cv;  
  15.   
  16.   
  17. //队列节点结构  
  18. typedef struct QNode  
  19. {  
  20.     IplImage * img;  
  21.     struct QNode * next;  
  22. }QNode, *QueuePtr;  
  23.   
  24. //队列的链表结构  
  25. typedef struct  
  26. {  
  27.     QueuePtr front, rear;   //队头队尾指针  
  28. }LinkQueue;  
  29.   
  30. //求队列长度  
  31. int QueueLength(LinkQueue * Q);  
  32.   
  33. //构建一个新队列  
  34. bool InitQueue(LinkQueue * Q);  
  35.   
  36. //销毁队列  
  37. bool DestoryQueue(LinkQueue * Q);  
  38.   
  39. //队列在队尾插入节点,入队操作  
  40. //插入元素data为Q的新的队尾元素,插入成功返回true,否则返回false  
  41. bool EnQueue(LinkQueue *Q, IplImage * data);  
  42.   
  43. //队列在队头删除节点,出队操作  
  44. //若队列不为空,删除Q的队头元素,用data返回该图像的地址,并返回true表示操作成功,否则返回false  
  45. bool DeQueue(LinkQueue *Q, IplImage ** data);  
  46. //IplImage * DeQueue(LinkQueue *Q);  
  47.   
  48.   
  49. #endif  

filename: Queue.cpp

  1. #include "Queue.h"  
  2.   
  3. //构建一个新队列  
  4. //队头和队尾指针都指向同一个节点  
  5. bool InitQueue(LinkQueue *Q)  
  6. {   
  7.     Q->front=Q->rear = new QNode;  
  8.     if(!Q->front)  
  9.         return false;  
  10.     Q->front->next=NULL;  
  11.     return true;  
  12. }  
  13.   
  14. //销毁队列  
  15. bool DestoryQueue(LinkQueue * Q)  
  16. {  
  17.     while(Q->front)  
  18.     {  
  19.          Q->rear=Q->front->next;  
  20.          delete Q->front;  
  21.          Q->front=Q->rear;  
  22.     }  
  23.     return true;  
  24. }  
  25.   
  26.   
  27. /* 求队列的长度 */  
  28. int QueueLength(LinkQueue * Q)  
  29. {   
  30.     int i=0;  
  31.     QueuePtr p;  
  32.     p= Q->front;  
  33.     while(Q->rear!=p)  
  34.     {  
  35.          i++;  
  36.          p=p->next;  
  37.     }  
  38.     return i;  
  39. }  
  40.   
  41.   
  42. //队列在队尾插入节点,入队操作  
  43. //插入元素data为Q的新的队尾元素,插入成功返回true,否则返回false  
  44. bool EnQueue(LinkQueue *Q, IplImage * data)  
  45. {  
  46.     QueuePtr s = new QNode;  
  47.     if(!s)   //存储空间分配失败  
  48.         return false;  
  49.     s->img = data;  
  50.     s->next = NULL;  
  51.     Q->rear->next = s;  
  52.     Q->rear = s;  
  53.     return true;  
  54. }  
  55.   
  56.   
  57. //队列在队头删除节点,出队操作  
  58. //若队列不为空,删除Q的队头元素,用data返回该图像的地址,并返回true表示操作成功,否则返回false  
  59. bool DeQueue(LinkQueue *Q, IplImage ** data)  
  60. {  
  61.       
  62.     QueuePtr p;  
  63.     if(Q->front == Q->rear)  
  64.     {  
  65.         cout<<"The Queue is NULL!"<<endl;  
  66.         return false;  
  67.     }  
  68.     p = Q->front->next;  
  69.     *data = p->img;  
  70.     Q->front->next = p->next;  
  71.     if(Q->rear == p)  
  72.         Q->rear = Q->front;  
  73.     delete p;  
  74.     return true;  
  75. }  

这个跟大话数据结构一书上的链队列其实是一样的,只不过数据不再是elementtype data,而是 IplImage * img.



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多