原文地址 从海康威视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,否则返回false
- bool EnQueue(LinkQueue *Q, IplImage * data);
-
- //队列在队头删除节点,出队操作
- //若队列不为空,删除Q的队头元素,用data返回该图像的地址,并返回true表示操作成功,否则返回false
- bool 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,否则返回false
- bool 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表示操作成功,否则返回false
- bool 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.
|