来自于南京理工大学的一位极好老师,如果对图像处理感兴趣,强烈推荐。该框架有如下好处:
1、构造函数只是简单初始化,而不传递参数进行初始化。因为视频的帧处理时使用的类是相同的,重复声明类是没有必要的。可以利用已经生成的对象。因此用一个专门的可以主动调用的初始化函数来对参数进行初始化,以适应不同参数的图像。
2、在初始化函数中申请内存,如果已申请内存大于要处理的图像,将不会重复申请,并且有专门的内存释放函数。在析构函数中主动调用,释放内存。
3、可以调试某一帧图像。
// RmwImgProcFrame.h : header file
//
#ifndef RMW_IMG_PROC_FRAME_H
#define RMW_IMG_PROC_FRAME_H
class RmwImgProcFrame
{
public:
//构造/析构
RmwImgProcFrame();
~RmwImgProcFrame();
//初始化
bool Initialize(bool isRGB,int width,int height);
//执行
bool DoNext(BYTE *pImgData);
//结果
BYTE *GetResImg();
int GetResWidth();
int GetResHeight();
private:
// 内存释放
void Dump();
// 调试
void Debug();
private:
//初始化成功
bool m_isInitOK;
//图像属性
bool m_isRGB;
int m_width;
int m_height;
//内存
BYTE *m_pRGBImg;
BYTE *m_pGryImg;
BYTE *m_pGrdImg;
BYTE *m_pTmpImg;
BYTE *m_pResImg;
int m_memSize;
//内部计数器
int m_nFrameID;
};
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RmwImgProcFrame.cpp : implementation file
//
////////////////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include "RmwImgProcFrame.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 构造/析构函数
//
////////////////////////////////////////////////////////////////////////////////////////////////////
RmwImgProcFrame::RmwImgProcFrame()
{ //<在构造函数中把所有的成员变量赋初值>
//是否初始化成功
m_isInitOK=false;
//图像属性
m_isRGB=false;
m_width=0;
m_height=0;
//内存空间
m_pRGBImg=NULL;
m_pGryImg=NULL;
m_pGrdImg=NULL;
m_pTmpImg=NULL;
m_pResImg=NULL;
m_memSize=0; //已申请的内存字节数
//内部计数器
m_nFrameID=0;
}
RmwImgProcFrame::~RmwImgProcFrame()
{ //<在析构函数中释放所有的内存>
Dump();
}
void RmwImgProcFrame::Dump()
{ //<写一个专门的用作释放内存的函数,因为内存会有多次的申请与释放>
if (m_pRGBImg) { delete m_pRGBImg; m_pRGBImg=NULL; }
if (m_pGryImg) { delete m_pGryImg; m_pGryImg=NULL; }
if (m_pGrdImg) { delete m_pGrdImg; m_pGrdImg=NULL; }
if (m_pTmpImg) { delete m_pTmpImg; m_pTmpImg=NULL; }
if (m_pResImg) { delete m_pResImg; m_pResImg=NULL; }
m_memSize=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 初始化
//
////////////////////////////////////////////////////////////////////////////////////////////////////
bool RmwImgProcFrame::Initialize(bool isRGB,int width,int height)
{ //<在初始化函数中对所有的成员变量赋初值>
//<仅在初始化函数中申请内存,因为初始化函数不会被频繁调用>
//<初始化函数可以被多次调用>
//<内存申请时,若已经申请的内存大于本次需要的内存,则不再次申请>
//step.1------图像属性--------------------------//
m_isRGB=isRGB;
m_width=width;
m_height=height;
//step.2------内存申请--------------------------//
if (m_width*m_height>m_memSize)
{
//先释放
Dump();
//后申请
m_pRGBImg=new BYTE [m_width*m_height*3]; //彩色图像
m_pGryImg=new BYTE [m_width*m_height]; //灰度图像
m_pGrdImg=new BYTE [m_width*m_height]; //梯度图像
m_pTmpImg=new BYTE [m_width*m_height]; //临时图像
m_pResImg=new BYTE [m_width*m_height]; //结果图像
//记录申请的大小
m_memSize=m_width*m_height;
}
//step.3------初始化成功标志--------------------//
m_isInitOK=(m_pRGBImg && m_pGryImg && m_pGrdImg && m_pTmpImg && m_pResImg);
return m_isInitOK;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 执行
//
////////////////////////////////////////////////////////////////////////////////////////////////////
bool RmwImgProcFrame::DoNext(BYTE *pImgData)
{
if (!m_isInitOK) return false;
//...
//...
//...
//某个特定帧的调试,比如10
if (m_nFrameID==10)
{
Debug();
}
//内部计数器累加
m_nFrameID++;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 结果
//
////////////////////////////////////////////////////////////////////////////////////////////////////
BYTE *RmwImgProcFrame::GetResImg()
{ //返回结果图像
return m_pResImg;
}
int RmwImgProcFrame::GetResWidth()
{ //返回结果图像的宽度
return m_width;
}
int RmwImgProcFrame::GetResHeight()
{ //返回结果图像的高度
return m_height;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 调试
//
////////////////////////////////////////////////////////////////////////////////////////////////////
void RmwImgProcFrame::Debug()
{ //<本类的内部调试: 屏幕输出、文件输出等>
return;
}