内存IplImage图像链队列实现

来源:互联网 发布:昆仑虚手游进阶数据 编辑:程序博客网 时间:2024/05/20 04:27

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

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

filename: Queue.h

/**********************************************************************************************************由于图片生成后都是放在内存里面的,而且中间不会进行什么插入、删除操作,所以链队列是最好的选择。*构建一个存放图片的链队列*********************************************************************************************************/#ifndef __Queue_H__#define __Queue_H__#include <iostream>#include "cv.h"#include "highgui.h"using namespace std;using namespace cv;//队列节点结构typedef struct QNode{IplImage * img;struct QNode * next;}QNode, *QueuePtr;//队列的链表结构typedef struct{QueuePtr front, rear;   //队头队尾指针}LinkQueue;//求队列长度int QueueLength(LinkQueue * Q);//构建一个新队列bool InitQueue(LinkQueue * Q);//销毁队列bool DestoryQueue(LinkQueue * Q);//队列在队尾插入节点,入队操作//插入元素data为Q的新的队尾元素,插入成功返回true,否则返回falsebool EnQueue(LinkQueue *Q, IplImage * data);//队列在队头删除节点,出队操作//若队列不为空,删除Q的队头元素,用data返回该图像的地址,并返回true表示操作成功,否则返回falsebool DeQueue(LinkQueue *Q, IplImage ** data);//IplImage * DeQueue(LinkQueue *Q);#endif

filename: Queue.cpp

#include "Queue.h"//构建一个新队列//队头和队尾指针都指向同一个节点bool InitQueue(LinkQueue *Q){ Q->front=Q->rear = new QNode;if(!Q->front)return false;Q->front->next=NULL;return true;}//销毁队列bool DestoryQueue(LinkQueue * Q){while(Q->front){ Q->rear=Q->front->next; delete Q->front; Q->front=Q->rear;}return true;}/* 求队列的长度 */int QueueLength(LinkQueue * Q){ int i=0;QueuePtr p;p= Q->front;while(Q->rear!=p){ i++; p=p->next;}return i;}//队列在队尾插入节点,入队操作//插入元素data为Q的新的队尾元素,插入成功返回true,否则返回falsebool EnQueue(LinkQueue *Q, IplImage * data){QueuePtr s = new QNode;if(!s)   //存储空间分配失败return false;s->img = data;s->next = NULL;Q->rear->next = s;Q->rear = s;return true;}//队列在队头删除节点,出队操作//若队列不为空,删除Q的队头元素,用data返回该图像的地址,并返回true表示操作成功,否则返回falsebool DeQueue(LinkQueue *Q, IplImage ** data){QueuePtr p;if(Q->front == Q->rear){cout<<"The Queue is NULL!"<<endl;return false;}p = Q->front->next;*data = p->img;Q->front->next = p->next;if(Q->rear == p)Q->rear = Q->front;delete p;return true;}

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



4 0
原创粉丝点击