2011/01/21

OpenCV IplImage 를 DC 에 그리기

OpenCV 의 이미지 개체인 IplImage 를 DC에 그리는 것은 OpenCV 안에 포함(2.2 버전 미만)되어 있는 CvvImage 클래스를 이용하면 쉽게 처리할 수 있다. 





하지만 최근 2.2 버전에서는 무슨 이유에서인지 이 클래스가 삭제 되었다. 그래서 다른 방법을 찾아 보았다. 사실 CvvImage 의 존재를 OpenCV 를 다루기 시작한지 오래 되었을 때 알아서 그전에 CvvImage 에 대해서 알지 못하였을 때 쓰던 방법이다.






각각의 Pixel의 값을 읽어들여 DC에 해당 픽셀을 그리는 방법이다.

int CTestOpenCV22Dlg::IplToDC( IplImage* pImage, CDC* pDC )
{
CvRect rcROI = cvGetImageROI( pImage );
CRect rcImage;
rcImage.left = rcROI.x;
rcImage.right = rcImage.left + rcROI.width;
rcImage.top = rcROI.y;
rcImage.bottom = rcImage.top + rcROI.height;

if ( pImage->depth == IPL_DEPTH_8U || pImage->depth == IPL_DEPTH_8S )
{
switch ( pImage->nChannels )
{
case 1:
{
BYTE *pRow;
BYTE byte;

for ( int y = rcImage.top, y2 = 0; y < rcImage.bottom; ++y, ++y2 )
{
pRow = (BYTE *)(pImage->imageData + pImage->widthStep * y);

for ( int x = rcImage.left, x2 = 0; x < rcImage.right; ++x, ++x2 )
{
byte = pRow[ x ];

pDC->SetPixelV( x2, y2, RGB( byte, byte, byte ) );
}
}
}
break;

case 3:
{
BYTE *pRow;
BYTE byte[ 3 ];

for ( int y = rcImage.top, y2 = 0; y < rcImage.bottom; ++y, ++y2 )
{
pRow = (BYTE *)(pImage->imageData + pImage->widthStep * y);

for ( int x = rcImage.left, x2 = 0; x < rcImage.right; ++x, ++x2 )
{
int index = x * 3;
byte[ 0 ] = pRow[ index ]; // B
byte[ 1 ] = pRow[ index + 1 ]; // G
byte[ 2 ] = pRow[ index + 2 ]; // R

pDC->SetPixelV( x2, y2, RGB( byte[2], byte[1], byte[0] ) );
}
}
}
break;
}
}

return NO_ERROR;
}



위 코드는 8Bit 1채널(흑백) 또는 3채널(컬러) 영상을 뿌리는 코드로 알파 채널이 추가된 이미지나 16비트 단위 영상데이트를 출력하는 기능도 추가하면 좋을

Original Post : http://neodreamer-dev.tistory.com/490

No comments :

Post a Comment