2011/01/21
OpenCV IplImage 를 DC 에 그리기
OpenCV 의 이미지 개체인 IplImage 를 DC에 그리는 것은 OpenCV 안에 포함(2.2 버전 미만)되어 있는 CvvImage 클래스를 이용하면 쉽게 처리할 수 있다.
하지만 최근 2.2 버전에서는 무슨 이유에서인지 이 클래스가 삭제 되었다. 그래서 다른 방법을 찾아 보았다. 사실 CvvImage 의 존재를 OpenCV 를 다루기 시작한지 오래 되었을 때 알아서 그전에 CvvImage 에 대해서 알지 못하였을 때 쓰던 방법이다.
각각의 Pixel의 값을 읽어들여 DC에 해당 픽셀을 그리는 방법이다.
위 코드는 8Bit 1채널(흑백) 또는 3채널(컬러) 영상을 뿌리는 코드로 알파 채널이 추가된 이미지나 16비트 단위 영상데이트를 출력하는 기능도 추가하면 좋을
Original Post : http://neodreamer-dev.tistory.com/490
하지만 최근 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
Labels:
CvvImage
,
OpenCV
,
OpenCV 2.2
,
TistoryOldPost
Subscribe to:
Post Comments
(
Atom
)
No comments :
Post a Comment