图形编程框架-来自RMW

来自于南京理工大学的一位极好老师,如果对图像处理感兴趣,强烈推荐。该框架有如下好处:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值