SPRING :: NOTE
[OpenCV] cv::mat으로 받은 데이터 Controller에 출력 본문
Development Language/C · C++ · MFC
[OpenCV] cv::mat으로 받은 데이터 Controller에 출력
RAYZIE 2019. 7. 4. 10:25반응형
아래의 함수를 추가하며, 파라미터 값에 VideoPicture에서 들어온 capture data를 cv::mat에 copy한다.
copy된 cv::mat을 인자값으로 넣어주며, m_GstView가 Picture Controll 또는 Static Controll의 멤버변수이다.
void CGStreamerExDlg::DisplayVideo(Mat frame)
{
// m_CamMinX, m_CamMinY, m_CamMaxX, m_CamMaxY,
//화면에 보여주기 위한 처리입니다.
int bpp = 8 * frame.elemSize();
assert((bpp == 8 || bpp == 24 || bpp == 32));
int padding = 0;
//32 bit image is always DWORD aligned because each pixel requires 4 bytes
if (bpp < 32)
padding = 4 - (frame.cols % 4);
if (padding == 4)
padding = 0;
int border = 0;
//32 bit image is always DWORD aligned because each pixel requires 4 bytes
if (bpp < 32)
{
border = 4 - (frame.cols % 4);
}
Mat mat_temp;
if (border > 0 || frame.isContinuous() == false)
{
// Adding needed columns on the right (max 3 px)
cv::copyMakeBorder(frame, mat_temp, 0, 0, 0, border, cv::BORDER_CONSTANT, 0);
}
else
{
mat_temp = frame;
}
//pDlg->DisplayImage(IDC_GST_VIEWER, frame(Rect(480, 270, 960, 540)));
RECT r;
m_GstView.GetClientRect(&r);
//cv::Size winSize(r.right, r.bottom);
cv::Size winSize(r.right, r.bottom);
cimage_mfc.Create(winSize.width, winSize.height, 24);
BITMAPINFO *bitInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));
bitInfo->bmiHeader.biBitCount = bpp;
bitInfo->bmiHeader.biWidth = mat_temp.cols;
bitInfo->bmiHeader.biHeight = -mat_temp.rows;
bitInfo->bmiHeader.biPlanes = 1;
bitInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitInfo->bmiHeader.biCompression = BI_RGB;
bitInfo->bmiHeader.biClrImportant = 0;
bitInfo->bmiHeader.biClrUsed = 0;
bitInfo->bmiHeader.biSizeImage = 0;
bitInfo->bmiHeader.biXPelsPerMeter = 0;
bitInfo->bmiHeader.biYPelsPerMeter = 0;
//그레이스케일 인경우 팔레트가 필요
if (bpp == 8)
{
RGBQUAD* palette = bitInfo->bmiColors;
for (int i = 0; i < 256; i++)
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
palette[i].rgbReserved = 0;
}
}
// Image is bigger or smaller than into destination rectangle
// we use stretch in full rect
if (mat_temp.cols == winSize.width && mat_temp.rows == winSize.height)
{
// source and destination have same size
// transfer memory block
// NOTE: the padding border will be shown here. Anyway it will be max 3px width
SetDIBitsToDevice(cimage_mfc.GetDC(),
//destination rectangle
0, 0, winSize.width, winSize.height,
0, 0, 0, mat_temp.rows,
mat_temp.data, bitInfo, SRCCOPY);
}
else
{
// destination rectangle
int destx = 0, desty = 0;
int destw = winSize.width;
int desth = winSize.height;
// rectangle defined on source bitmap
// using imgWidth instead of mat_temp.cols will ignore the padding border
int imgx = 0, imgy = 0;
int imgWidth = mat_temp.cols - border;
int imgHeight = mat_temp.rows;
StretchDIBits(cimage_mfc.GetDC(),
destx, desty, destw, desth,
imgx, imgy, imgWidth, imgHeight,
mat_temp.data, bitInfo, DIB_RGB_COLORS, SRCCOPY);
}
HDC dc = ::GetDC(m_GstView.m_hWnd);
cimage_mfc.BitBlt(dc, 0, 0);
::ReleaseDC(m_GstView.m_hWnd, dc);
cimage_mfc.ReleaseDC();
cimage_mfc.Destroy();
}
반응형
'Development Language > C · C++ · MFC' 카테고리의 다른 글
[C++] CString to UINT 형변환 (0) | 2019.07.23 |
---|---|
[C++/MFC] libvlc(VLC library)를 이용하여 RTP over RTSP 옵션 추가 (0) | 2019.07.16 |
[GStreamer] TCP/IP로 Cam Streaming (0) | 2019.06.26 |
[MFC] Application Close Code(프로그램 종료 코드) (0) | 2018.12.11 |
[C++] FTP Upload/Download 구현 클래스(매우 유용) (0) | 2018.12.03 |
Comments