반응형



OpenCV에서 캡처한 웹캠 영상을 MFC의 Picture Control에 보여주기 위해 필요한 과정을 설명합니다.

OpenCV 4.1.0Visual Studio Community 2017를 사용해서 진행했지만 다른 버전에서도 거의 동일하게 동작할 듯합니다.



다이얼로그기반 MFC 프로젝트 생성부터 예제 코드 실행까지 단계별로 설명합니다.



1. MFC 응용 프로그램 생성


2. UI 구성


3. OpenCV 관련 코드 추가


4. 실행 결과


5. 참고



2019. 5.  20



2018. 10. 22

그레이스케일 영상으로 변환 후, 영상출력이 제대로 안되는 문제가 있었네요..

BITMAPINFO에 palette를 추가해서 해결했습니다.




1. MFC 응용 프로그램 생성


1-1. Visual Studio 2017의 메뉴에서 파일 > 새로 만들기 > 프로젝트를 선택합니다.

MFC 응용 프로그램을 선택하고 이름을 지정해 줍니다.





1-2. 응용 프로그램 종류로  대화 상자 기반을 선택하고 SDL 검사 체크 해제후 마침을 클릭합니다.





1-3. 툴바의 솔루션 구성 Debug, 솔루션 플랫폼 x64로 변경합니다.





1-4. 다음 포스팅을 참고하여 OpenCV를 설정합니다. 1 ~ 3번, 9 ~ 19번을 진행하면 됩니다.


Visual Studio 2017에서 OpenCV 4.1.0을 사용하는 방법

http://webnautes.tistory.com/1132





2. UI 구성

OpenCV에서 캡쳐한 영상이 보여질 영역이 필요합니다.



2-1. 아래 스크린샷에 보이는 리소스 뷰의 다이얼로그를 더블 클릭합니다.  


리소스 뷰가 보이지 않으면 메뉴에서 보기 > 다른 창 > 리소스 뷰  또는 보기 > 리소스 뷰 를 선택하세요.

같은 비주얼 스튜디오 2017이라도 업데이트 정도에 따라 다르군요..





2-2. 도구 상자를 클릭 후  Picture Control을 드래그하여 다이얼로그 추가합니다.





2-3.  Picture Control을 배치한 결과입니다.





2-4. 다이얼로그 위에 있는 Picture Control을 선택한 상태에서 마우스 우클릭하여 보이는 메뉴에서 속성을 클릭합니다.


ID IDC_PICTURE로 수정하고 엔터를 눌러 변경합니다.

Ctrl + S를 눌러서 저장합니다.





2-5. 다시 다이얼로그 위에 있는 Picture Control을 선택하고 마우스 오른쪽 버튼을 클릭하여 메뉴에서 변수 추가를 선택합니다.


제어 변수 추가 창의 이름 항목에 m_picture를 입력하고 마침을 클릭합니다.




버전 차이로 다음처럼 보일 수 도 있습니다.





3. OpenCV 관련 코드 추가


3-1. Ctrl + Shift + X를 눌러서 클래스 마법사를 실행합니다.




3-2. 클래스 이름을 COpenGLwithMFCDlg로 변경합니다.

메시지 탭을 선택하고 리스트에서 WM_DESTROY를 선택 후 처리기 추가 버튼을  클릭합니다.




3-3. 같은 방식으로 WM_TIMER도 선택해서 추가하고 확인 버튼을 클릭합니다.





3-4. stdafx.h 파일에 OpenCV 헤더파일(노란색)을 추가합니다.


#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // Windows 공용 컨트롤에 대한 MFC 지원입니다.
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // MFC의 리본 및 컨트롤 막대 지원


#include "opencv2/opencv.hpp"

using namespace cv;




3-5. OpenCV with MFCDlg.h 파일에 멤버 변수를 추가해줍니다.


// 구현입니다.
protected:
HICON m_hIcon;

// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CStatic m_picture;
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT_PTR nIDEvent);

VideoCapture *capture;
Mat mat_frame;
CImage cimage_mfc;
};




3-6. OpenCV with MFCDlg.cpp 파일의 OnInitDialog 함수에 코드(노란색)를 추가합니다.


// TODO: 여기에 추가 초기화 작업을 추가합니다.
capture = new VideoCapture(0);
if (!capture->isOpened())
{
MessageBox(_T("캠을 열수 없습니다. \n"));
}

//웹캠 크기를  320x240으로 지정    
capture->set(CAP_PROP_FRAME_WIDTH, 320);
capture->set(CAP_PROP_FRAME_HEIGHT, 240);

SetTimer(1000, 30, NULL);


return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}




3-7. OpenCV with MFCDlg.cpp 파일의 OnTimer 함수에 코드를 추가합니다.


OnTimer 함수에서 영상을 가져온 후  CImage로 변환해서 화면에 출력합니다.

이때 출력되는 화면의 크기는 다이얼로그에 올려둔 picture 컨트롤러의 크기입니다.


void COpenCVwithMFCDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.


     //mat_frame가 입력 이미지입니다.
capture->read(mat_frame);

     //이곳에 OpenCV 함수들을 적용합니다.

     //여기에서는 그레이스케일 이미지로 변환합니다.
cvtColor(mat_frame, mat_frame, COLOR_BGR2GRAY);


     //화면에 보여주기 위한 처리입니다.
int bpp = 8 * mat_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 - (mat_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 - (mat_frame.cols % 4);
}



Mat mat_temp;
if (border > 0 || mat_frame.isContinuous() == false)
{
// Adding needed columns on the right (max 3 px)
cv::copyMakeBorder(mat_frame, mat_temp, 0, 0, 0, border, cv::BORDER_CONSTANT, 0);
}
else
{
mat_temp = mat_frame;
}


RECT r;
m_picture.GetClientRect(&r);
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, DIB_RGB_COLORS);
}
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_picture.m_hWnd);
cimage_mfc.BitBlt(dc, 0, 0);


::ReleaseDC(m_picture.m_hWnd, dc);

cimage_mfc.ReleaseDC();
cimage_mfc.Destroy();


CDialogEx::OnTimer(nIDEvent);
}





4. 실행 결과


4-1. F5키를 눌러서 실행한 결과입니다.





4-2.  예전 버전에서 발생했던 에러를 해결한 내용인데 남겨둡니다.


1>c:\opencv-3.2.0\build\include\opencv2\flann\logger.h(66): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.



메시지에 나온대로  프로젝트 설정에 _CRT_SECURE_NO_WARNINGS를 추가하면 해결됩니다.



메뉴에서 프로젝트 > 속성을 선택합니다. 왼쪽 패널에서 C/C++ > 전처리기를 선택합니다.




전처리기 정의 항목에 다음을 추가합니다.


;_CRT_SECURE_NO_WARNINGS




다시 실행해보면 정상적으로 실행이 됩니다.



5. 참고


http://stackoverflow.com/a/29006218   


http://pklab.net/pagefiles/LoadBmp/PkMatToGDI.hpp


https://stackoverflow.com/a/28525365


반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

  1. 이전 댓글 더보기
  2. 강경모 2018.05.21 13:55

    자료 잘봤습니다. 라즈베리파이 3에서 mjpg streamer를 이용하여 videocapture () 안에 IP주소와 포트번호를 틀림없이 입력하였으나 assert((bpp==8 || bpp ==24 || bpp == 32 )) 부분에서 assertion 오류가 뜹니다. 제발 도와주세요 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.05.22 10:59 신고

      다음처럼 웹 기반으로 영상을 확인해보셨나요?

      http://kr.bluesink.io/t/mjpg-streamer/56

    • 강경모 2018.05.23 08:21

      네 웹으로 영상 잘 나오는 것도 확인했습니다.
      videocapture() 안에 "http://IP:PORT번호/mjpeg/video.mjpg?counter" 라고도해보고
      "http://IP:PORT/mjpg/video.mjpg " 라고도 해봤는데 똑같은 오류가 발생합니다 ㅠ

    • 강경모 2018.05.23 16:35

      제가 해결 해버렸습니다. 그냥 포트번호 뒤쪽을 잘못 입력하였습니다. 그런데 한가지 더 질문이 라즈베리파이에서 카메라모듈로 영상 하나, 열화상 카메라로 영상 하나, 총 두개의 영상을 스트리밍 하고자 하는데 picture control 하나로는 영상 스트리밍이 하나의 영상밖에 되지 않고 picturecontrol 2개를 쓰는 방법을 잘모르겠습니다. 혹시 알려주실 수 있나요 ㅠ??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.05.24 23:25 신고

      picture control를 하나 더 배치한 후 포스팅에 나온대로 변수를 추가하고

      아래 코드 부분을 cimage_mfc.ReleaseDC(); 앞에 복사해준다음..

      m_picture를 추가한 변수로 변경해보세요.


      RECT r;
      m_picture.GetClientRect(&r);

      ~~~

      HDC dc = ::GetDC(m_picture.m_hWnd);
      cimage_mfc.BitBlt(dc, 0, 0);
      ::ReleaseDC(m_picture.m_hWnd, dc);

    • 강경모 2018.05.28 11:28

      두개의 picture control 의 변수를 모두 m_picture로 지정하는 게 맞나요? ㅜㅜ 자꾸 질문 드려 죄송합니다..

    • 강경모 2018.05.28 11:42

      저는 ONlnitDialog() 함수안에
      capture1 = new VideoCapture(1번영상 IP)
      capture2 = new VideoCapture(2번영상 IP)
      이런식으로 각각 선언해주었고 다른 모든 코드에서 capture를 capture1과 capture2로 각각 나누어서 선언하였습니다. 그 결과 오히려 capture2로 선언한 영상만 첫번째 picturecontrol에 나오고 두번째 picture 컨트럴에는 캠을 열수없습니다. 만 나오고 오류가 뜹니다. 각각 따로 하면 물론 문제 없이 재생이 됩니다.

    • 강경모 2018.05.28 14:47

      그리고 이 코드가 윈도우 10 VS 2017 버전에서는 잘 돌아가는데 윈도우 7 버전에서는 작동이 중지되었다고 나옵니다.. 혹시 윈도우 7에서는 호환이 안되는건가요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.05.28 20:42 신고

      문제 없어 보입니다.

      Visual Studio 2017만 똑같이 사용한다면 운영체제랑 상관없이 동작할듯 보입니다.

      윈7과 윈10 차이로 발생하는 문제라면 코드에서 사용한 API 함수들을 검토해봐야 할듯 합니다

  3. weenie 2018.11.16 06:36

    안녕하세요. mfc로 영상처리 공부하려고 코드를 서서 실행 시켰는데 제 캠에서는 흑백으로 출력영상이 나오던데 색상은 입력받을려면 어디를 수정해야 될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.11.16 08:06 신고

      OnTimer에서 다음 부분을 제거하면 됩니다.

      cvtColor(mat_frame, mat_frame, COLOR_BGR2GRAY);

  4. brad 2019.02.01 10:32

    안녕하세요. 포스트 보고 opencv를 사용해보고 있습니다.
    opencv 4.01을 이용해서 해봤는데, 3840x2160은 정상적으로 저장이 되는데,
    4208x3120의 경우에는 상단 하단 부분이 일부 검게 나오는 현상이 있더라구요.
    해상도가 커지는 만큼 이미지가 커져야 되는데, 그렇지 못하고 커진 영역이 검게 나오는 것
    같네요. 카메라 자체는 문제가 없구요, 제공되는 applicaiton에서는 정상동작하는데...
    초보라서 어떻게 접근해야 할지 잘몰라서 글남겨 봅니다.
    새해복많이 받으세요.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.01 12:43 신고

      OpenCV 문제라서 해결방법을 찾기가 쉽지 않을듯합니다.

  5. 2019.05.03 16:43

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.03 19:00 신고

      에러난 코드 위치를 알려주지 않나요?

      댓글달아주신 에러 메시지만 보고는 원인을 알 수 없습니다.

  6. 김형동 2019.05.19 14:27

    안녕하세요
    저는 MFC로 Serial 통신과 OpenCV를 사용해 영상출력을 하고 있습니다.
    제가 만든 Serial 통신과 OpenCV영상을 실행했을 때 디버그는 오류없이 잘 되고 Serial통신도 잘 작동합니다.
    그런데 영상이 출력이 아예 되지를 않는데 이유를 알 수 있을까요??
    코드는 위에 적혀진 그대로 추가하였습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.19 19:40 신고

      imwrite 함수로 영상을 저장하여 카메라로부터 영상이 입력되고있는지 확인해봐야 할거 같습니다.

    • 김형동 2019.05.20 13:21

      imwrite가 정의만 되어있고 사용은 안되고 있습니다.
      -카메라 출력 코드는 위에 작성하신 그대로 사용했습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.20 13:51 신고

      VideoCapture 바로 다음에 넣어서 저장해보세요..

      저장된다면 타이머함수가 동작안하는 건 아닌지 모르겠군요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.20 13:52 신고

      비주얼스튜디오 버전이 어떻게 되는지요?

    • 김형동 2019.05.20 19:23

      버전은 2017버전을 사용하고 있습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.20 20:10 신고

      확인해봤는데 포스트 내용대로 하면 문제없이 영상이 출력됩니다..

      기존 코드와 추가해서 사용하는 건가요?

    • 김형동 2019.05.26 15:37

      Serial 코드는 http://blog.daum.net/_blog/BlogTypeView.do?blogid=0MMaA&articleno=8039404&categoryId=0&regdt=20121225062827
      의 예제를 사용하며 웹캠 코드를 섞어서 사용하고 있습니다..!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.26 18:33 신고

      확인해보니 쓰레드를 사용하여 수신된 문자열이 있을때에만 화면에 출력해주는 것같은데...

      시리얼 관련 코드를 막아놓고..
      웹캠 영상이 문제 없이 출력되는지 테스트해보세요.

  7. Favicon of http://webnautes.tistory.com/824 BlogIcon 흑흑 2019.05.19 20:46

    3-4. stdafx.h 파일
    블로그에서 하라는 그대로 하였는데 stdafx.h 파일이 안보이는경우에는 어떻게 해야하는지 실례가 안된다면 여쭤봐도 될까요...?ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.19 21:04 신고

      대신 OpenCV with MFCDlg.h 파일에 추가하세요.. 프로젝트 이름을 바꾸었다면 Dlg.h로 끝나는 파일입니다

    • 흑흑 2019.05.19 21:10

      답변 정말 감사합니다!!! 혹시 stdafx.h 파일이 안보이는 이유가 따로 있는건가요...?!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.19 21:11 신고

      비주얼 스튜디오 업데이트후 바뀌었을수도 있습니다. 글작성시점엔 있던것이 업데이트 된 버전에선 없는거지요. 이런 경우가 종종있습니다

  8. 2019.05.19 21:40

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.19 21:58 신고

      프로젝트 설정에 opencv 헤더파일 위치를 입력안했다면 1.4에 언급한 포스트에 나온대로 하세요

  9. INeedU'rHelp 2019.05.28 09:52

    안녕하세요 ~
    덕분에 많은 정보 잘 얻어갑니다.
    putText를 사용하려하는데, 해당 소스의 IMG param은 어떤 부분인지 이해가 잘 안됩니다. ;(
    혹시 좀더 상세한 설명을 부탁드려도 될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.28 09:54 신고

      capture->read(mat_frame);코드 다음부터 mat_frame를 사용하면 됩니다.

    • INeedU'rHelp 2019.05.28 10:24

      답변 감사합니다.

      저도 논리적으로는 그게 맞다고 해서 해봤는데, 적용이 안되더라구요 ㅜ_ㅜ

      아래 소스 우선 공유 드립니다.
      혹여라도 제가 실수한 부분이 있을까요?

      // ※ 영상 출력 소스, mat_frame가 입력 이미지
      capture->read(mat_frame);


      //영상 하단에 날짜 출력
      // if (m_check_date.GetCheck() == 1)
      putText(mat_frame, myText, myPoint, myFontFace, myFontScale, Scalar(255, 128, 0), (int)2, myFontLine);

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.28 10:37 신고

      코드만 봐서는 문제가 없어보입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.28 12:28 신고

      혹시 모르니.. putText를 다른 코드에서 테스트해서 문제 없나 확인해보세요

    • INeedU'rHelp 2019.05.28 12:37

      감사합니다.

      부끄럽게도...
      x,y 좌표값들을 과하게 넣는 논리적 오류가 있었습니다... 허허
      해결했어요!

  10. jhp21c 2019.06.01 22:11

    여기서 얻은 영상을 반전하고싶은데 뭘 추가하면 되나요?

    • jhp21c 2019.06.01 23:02

      캠영상이 무슨 이름으로 저장되있는지도 알려주세요 ㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.02 12:44 신고

      다음 위치에 반전하는 영상을 추가하면 됩니다.


      //이곳에 OpenCV 함수들을 적용합니다.

      //여기에서는 그레이스케일 이미지로 변환합니다.
      cvtColor(mat_frame, mat_frame, COLOR_BGR2GRAY);


      반전은 다음 글을 참고하세요
      https://076923.github.io/posts/Python-opencv-11/

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.02 12:44 신고

      영상을 저장하고 있지 않습니다.

  11. HYJ 2019.07.15 17:03

    안녕하세요~ 초보라 예제 보면서 많은 도움을 받고 있습니다. 감사합니다.

    질문이 한가지 있는데요,

    //웹캠 크기를 320x240으로 지정
    capture->set(CAP_PROP_FRAME_WIDTH, 320);
    capture->set(CAP_PROP_FRAME_HEIGHT, 240);

    이 부분에서 제가 웹캠 크기를 키우고 싶어서, 1920x1080 등으로 크게 바꾸어 봤는데, 화질이 급격하게 떨어지더라구요. 이런부분을 조정하려면 코드 어느 부분을 수정하면 되나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.15 17:31 신고

      카메라의 영상을 조정하면 화질이 떨어질 수 밖에 없습니다. 카메라가 제공하는 최대 해상도가 정해져 있거든요.

      OpenCV의 resize 함수를 사용하여 화면을 확대하는 방법을 사용해보세요.

  12. 안녕하세요~ 2019.07.19 10:30

    좋은 아침입니다. :)
    MFC에서 5초정도 영상을 무한반복 하고싶은데,
    무슨 코드를 손봐야 할지 알 수 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.19 11:01 신고

      이런 식으로 해야 할듯합니다.

      https://stackoverflow.com/a/44104194

  13. hi 2019.07.19 10:49

    안녕하세요!
    이 글 보고 영상처리 공부 중인 학생입니다.

    다름이 아니라 제가 FHD 카메라를 이용해 고해상도 영상을 받아오고 싶어서
    capture->set(CAP_PROP_FRAME_WIDTH, 1920);
    capture->set(CAP_PROP_FRAME_HEIGHT, 1080);
    로 설정을 해줬습니다.

    영상은 잘 받아오는데 필터 씌운 것 처럼 하얀 부분에 보라색, 하늘색, 노란색 등 노이즈가 끼는데
    이런 것 없이 깨끗한 원본 영상을 얻을 방법이 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.19 11:38 신고

      테스트 환경이 안되서.. 확인 해볼 수가 없네요..

      다음처럼 32로 수정해보세요. 해결될지 모르겠습니다..
      cimage_mfc.Create(winSize.width, winSize.height, 32);

    • hi 2019.07.19 14:40

      변함이 없네요 ㅜ ㅜ
      다른 방법 강구해보고 찾게되면 대댓글 다시 달겠습니다...
      답변 감사드립니다

    • hi 2019.07.19 15:13

      StretchBlt 시 깨지는 현상때문인 것 같습니다.

      SetDIBitsToDevice(); 와
      StretchDIBits();

      상단에
      SetStretchBltMode(cimage_mfc.GetDC(), COLORONCOLOR); 를 해줬을 시 깨끗한 영상이 나옴을 확인했으나 바로 작동이 중지되었습니다가 떠버리네요...

    • hi 2019.07.19 15:25

      상단에 HDC dc_stretch = cimage_mfc.GetDC();
      이렇게 선언해주고 cimage_mfc.GetDC() 인자부분에 dc_stretch를 넣으니까 해결됐습니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.19 15:49 신고

      해결되서 다행입니다 : )

  14. help 2019.09.24 13:36

    m_hbitmap = 0 오류가 자꾸 뜨는데 어떻게 해결해야하나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.09.24 14:07 신고

      m_hbitmap 라는 변수가 코드에 없는거 같은데 다시 확인해보세요.

  15. Hong 2019.12.03 10:18

    화면 좌우반전하고 싶은데.. StretchBlt함수 쓰면 되는지, 어떻게 해야 되는지 알려주세요~

  16. 하이랜더킴 2019.12.17 23:28

    정말 설명잘되어있고 초보자도 따라하기쉽게 진행하게 되어있네요 ㅎ .. 혹시 캠두개 연결하고싶은데 rect r 에서 막히네요 ㅜㅜ 픽처컨트롤 두개에 각각 캠 볼수있는 방법없을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.18 08:21 신고

      픽쳐컨트롤을 두개 사용하고 변수 추가후 코드에서 각 변수별로 진행하도록 하면 될듯합니다

  17. 하이랜더킴 2019.12.18 10:22

    픽쳐컨트롤 추가(m_picture2)해서 각 변수별로 했었는데요
    하나씩 추가해서 잘되다

    RECT r;
    m_picture2.GetClientRect(&r);
    cv::Size winSize(r.right, r.bottom);

    cimage_mfc.Create(winSize.width, winSize.height, 24);
    또는

    RECT r2;
    m_picture2.GetClientRect(&r2);
    cv::Size winSize(r2.right, r2.bottom);

    cimage_mfc.Create(winSize.width, winSize.height, 24);

    하면 이 단계에서 메모리오류나요 ㅜㅜ 픽쳐 사이즈를 넘겨야 다음단계 진행이 되는데 잘안되네요..


    카메라 두대로 거리 측정하는프로그램 만들려는데 자료가 넘없네요... T^T

  18. 하이랜더킴 2019.12.18 22:27

    원인을 찾았습니다
    순차적으로 2개씩 빌드하면서 오류 점검했는데요 cimage_mfc2로 2개 하는 단계에서 아무리해도 안됩니다
    원인은 마지막에 cimage_mfc2 선언하면 중간과정이 어떻든 마지막에
    cimage_mfc2.ReleaseDC(); cimage_mfc2.Destroy(); 추가로 넣어줘야 하네요
    감사합니다

  19. 늦었지만 댓글 부탁드려도 될까요 2020.07.17 15:00

    덕분에 많은 도움 받고 있는 개발자 입니다.
    이 코드를 활용해서 영상을 녹화하는 프로그램을 만들었는데
    프레임 마다 delay를 주고 싶은데
    waitkey 말곤 방법이 없나요?
    키이벤트가 필요 없을 뿐 더러 타이머 안에 waitkey 를 집어 넣으면
    m_hBitmap == 0
    Debug Assertion Failed!
    에러가 나서요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.17 22:20 신고

      SetTimer(1000, 30, NULL)으로 간격을 조정하고 sleep 함수를 사용해보세요.

  20. CV 2020.08.06 13:32

    안녕하세요 파이썬 opencv 강좌도 잘보고 mfc로 해보려 하는데요
    picture control 크기가 작으면 화면이 필터를 쓴것처럼 나오더라구요
    capture->set 값을 바꿔봐도 별다른 차이점이 보이지 않는것 같은데 방법이 없을까요
    그리고 영상을 저장 하려면 어떻게 해야하는지 궁금합니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.06 13:47 신고

      picture control 관련 해결 방법은 아직 모릅니다. 영상저장은 OpenCV에서 하는 방식을 사용하는게 쉬울듯합니다.

    • BlogIcon CV 2020.08.06 15:07

      혹시 저장을 어떻게 해야할까요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.06 15:17 신고

      블로그 카데코리 opencv c++에서 동영상 관련 포스트를 찾아보세요

  21. JY 2020.10.18 23:35

    안녕하세요. 포스터 글 잘봤습니다. 감사합니다.
    위의 코드로 실행을 했는데요, 오류없이 빌드는 되는데 영상이 얻어지지 않아서 질문드립니다.
    visual studio 2015, opencv3.4.10버전을 사용하고 있고, 다른 센서들을 사용하기 위해 debug x86으로 하고있습니다.
    opencv가 32비트를 지원하지 않아서 cMake로 x86파일을 만들어서 사용했습니다(https://gammabeta.tistory.com/409 참조).

    빌드하게 되면 영상이 나와야하는 부분은 검은색으로 나옵니다.
    콘솔 창에는
    [ INFO:0] VIDEOIO: Enabled backends<5, sorted by priority>: FFMPEG<1000>; MSMF<990>; DSHOW<980>; CV_IMAGES<970>; CV_MJPEG<960>
    [ WARN:0] failed to set mediaType <stream 0, <640x480 @ 30> MFVideoFormat_RGB24<codec not found>
    라고 뜹니다.
    혹시 어떤게 문제인지 아시나요ㅠㅠ

    mfc 로 안하고 x64로 할때는 카메라 연결 잘됩니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.19 00:02 신고

      x86으로 mfc 사용하지 않고 윕캠영상을 가져올 수 있나요?

    • BlogIcon JY 2020.10.19 10:17

      mfc사용하지 않고 하면 영상 잘떴습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.19 10:35 신고

      에러를 봐서는 사용중인 카메라에서 현재 코드가 사용하는 rgb24 픽셀 포맷을 지원하지 않아 발생하는 것으로 보입니다.

    • BlogIcon JY 2020.10.19 10:53

      카메라는 logitech hd 720p를 사용중입니다. rgb24를 지원하는지 어떻게 알수 있나요?

    • BlogIcon JY 2020.10.19 12:01

      int bpp = 8 * camera1.elemSize();
      코드에서 웹캠에서 가져온 이미지를 그레이스케일로 바꾸지 않고 출력해서 확인해보니 24bit가 떳습니다. 그러면 rgb24를 지원하는것 맞나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.10.19 20:31 신고

      해결될지는 확실치 않지만 다음처럼 해보세요

      VideoCapture(0, CAP_DSHOW)

+ Recent posts