cvCreateFileCapture returns null error and make CvvImage manally (DrawToHDC())
[ Topics ]/OpenCV 2012. 5. 6. 15:55몇일전 OpenCV 2.4 버전이 릴리즈 되었다.
새로운 기능들이 많이 추가되고 한거같은데, 뭐 나의 관심 밖이니..
뭐 어째뜬 난 2.0 버전이 최신 버전일때부터 꾸준히 써왔는데, 이번에 작업하는 부분에서 동영상을 재생시켜야 했다.
잘 되려니 했는데.. 재생이 안되고 이런저런 문제점들이 급수기하적으로 막 쏟아지는거였다..
제일 중요한건 cvCreateFileCapture() 함수가 계속 파일을 못읽어들이고 NULL값을 리턴하는것이었다.
그래서 결국 2.4버전으로 갈아타고나서는 동영상 재생문제도 바로 해결,
하지만, 다른 커다란 문제점이 발생했다.
2.0버전만 써오던 나로써는 2.2 버전 Release 되었을때 CvvImage 클래스가 사라진것을 몰랐다..!! 젠장!!
그래서.. 이리저리 구글링하다가 나랑 같은 증상을 겪는 사람들이 많은걸 알고, 직접 구현??까진 아니구 취합해서 같은 기능을 하게 만들어보자고 생각해서 작업을 몇시간 진행했는데, 다행히 잘 구동 된다. 기존의 것과 똑같이!!
원래 CvvImage 클래스내부의 DrawToHDC()함수를 직접 구현했는데, 아래 소스코드도 첨부하겠다.
물론 소스코드는 본인이 취합한거라 지저분하거나 맘에 안드는 부분이 있을것인데, 쓸사람만 쓰길..
void CCV_Mgr::DrawToHDC(IplImage* pImage, HDC dc, RECT* rect)
{
if( rect && pImage && pImage->depth == IPL_DEPTH_8U && pImage->imageData )
{
uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
BITMAPINFO* bmi = (BITMAPINFO*)buffer;
int bmp_w = pImage->width, bmp_h = pImage->height;
CvRect roi = cvGetImageROI( pImage );
CvRect dst = RectToCvRect( *rect );
if( roi.width == dst.width && roi.height == dst.height )
{
Show( pImage, dc, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y );
return;
}
if( roi.width > dst.width )
{
SetStretchBltMode(
dc, // handle to device context
HALFTONE );
}
else
{
SetStretchBltMode(
dc, // handle to device context
COLORONCOLOR );
}
FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(pImage), pImage->origin );
::StretchDIBits(
dc,
dst.x, dst.y, dst.width, dst.height,
roi.x, roi.y, roi.width, roi.height,
pImage->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );
}
}
void CCV_Mgr::Show( IplImage* pImage, HDC dc, int x, int y, int w, int h, int from_x, int from_y )
{
if( pImage && pImage->depth == IPL_DEPTH_8U )
{
uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
BITMAPINFO* bmi = (BITMAPINFO*)buffer;
int bmp_w = pImage->width, bmp_h = pImage->height;
FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(pImage), pImage->origin );
from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );
from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );
int sw = MAX( MIN( bmp_w - from_x, w ), 0 );
int sh = MAX( MIN( bmp_h - from_y, h ), 0 );
SetDIBitsToDevice(
dc, x, y, sw, sh, from_x, from_y, from_y, sh,
pImage->imageData + from_y*pImage->widthStep,
bmi, DIB_RGB_COLORS );
}
}
void CCV_Mgr::FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
{
assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
memset( bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;
if( bpp == 8 )
{
RGBQUAD* palette = bmi->bmiColors;
int i;
for( i = 0; i < 256; i++ )
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
palette[i].rgbReserved = 0;
}
}
}
int CCV_Mgr::Bpp(IplImage* pImage)
{
return pImage ? (pImage->depth & 255)*pImage->nChannels : 0;
}
CvRect CCV_Mgr::RectToCvRect(RECT rect)
{
rect = NormalizeRect( rect );
return cvRect( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top );
}
RECT CCV_Mgr::NormalizeRect( RECT r )
{
int t;
if( r.left > r.right )
{
t = r.left;
r.left = r.right;
r.right = t;
}
if( r.top > r.bottom )
{
t = r.top;
r.top = r.bottom;
r.bottom = t;
}
return r;
}
'[ Topics ] > OpenCV' 카테고리의 다른 글
cvReleaseCapture() 사용할때 주의사항! (2) | 2013.11.19 |
---|---|
tbb.dll Error, 그리고 해결 (0) | 2012.09.19 |
cvFindContours() 함수 (0) | 2012.02.13 |
나의 구세주 : cvPointPolygonTest() (0) | 2012.02.09 |
Opencv Contour 구하는 부분 (0) | 2010.12.10 |