해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.
ex3) 필수 멤버 함수 구현하기
//기본 생성자 CMyImage(void) : m_nChannels(0) , m_nHeight(0) , m_nWidth(0) , m_nWStep(0) , m_pImageData(NULL) {}
기본 생성자에 의해 생성된 객체는 아무 내용을 담지 않으므로 멤버 변수들이 사용되는 일이 없어 아무 값을 넣어도 되지만 생성된 영상이 유효한지 확인할 때, 이들 멤버 변수값이 0인이 아닌지 확인하면 편리하다. 또한, m_pImageData의 경우 소멸자 안 메모리 해제 과정에서 NULL인지 아닌지 확인해야 하기 때문에 NULL로 초기화 해야 한다.
CMyImage(int nWidth, int nHeight, int nChannels = 1) : m_nChannels(nChannels) , m_nHeight(nHeight) , m_nWidth(nWidth) , m_nWStep(((nWidth*nChannels*sizeof(T)+3)&~3)/sizeof(T)) { m_pImageData = new T[m_nHeight*m_nWStep]; }
영상 처리 프로그램 내부에서 컬러 영상보다 회색조 영상을 사용하는 빈도가 높아 채널 변수에 기본 매개변수 값으로 1로 설정
//복사 생성자 CMyImage(const CMyImage& myImage) { m_nChannels = myImage.m_nChannels; m_nHeight = myImage.m_nHeight; m_nWidth = myImage.m_nWidth; m_nWStep = myImage.m_nWStep; m_pImageData = new T[m_nHeight*m_nWStep]; memcpy(m_pImageData, myImage.m_pImageData, m_nHeight*m_nWStep*sizeof(T)); } //대입 연산자 CMyImage& operator=(const CMyImage& myImage) { if (this == &myImage) return *this; m_nChannels = myImage.m_nChannels; m_nHeight = myImage.m_nHeight; m_nWidth = myImage.m_nWidth; m_nWStep = myImage.m_nWStep; if (m_pImageData) delete [] m_pImageData; if (myImage.m_pImageData != NULL) { m_pImageData = new T[m_nHeight*m_nWStep]; memcpy(m_pImageData, myImage.m_pImageData, m_nHeight*m_nWStep*sizeof(T)); } return *this; } //소멸자 ~CMyImage(void) { if (m_pImageData) { delete[] m_pImageData; } }
포인터 값을 멤버 변수로 가지고 있어 깊은 복사를 해야 하므로 복사 생성자와 대입 연산자를 재정의 해야 한다.
'영상처리 프로그래밍' 카테고리의 다른 글
영상 데이터 클래스 구현(5) (0) | 2017.06.04 |
---|---|
영상 데이터 클래스 구현(4) (0) | 2017.06.04 |
영상 데이터 클래스 구현(2) - 픽셀 데이터와 영상 정보 (0) | 2017.06.04 |
영상 데이터 클래스 구현(1) (0) | 2017.06.04 |
기타 MFC (0) | 2017.06.04 |