반응형

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

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



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



1. MFC 응용 프로그램 생성

 

2. UI 구성

 

3. OpenCV 관련 코드 추가

 

4. 실행 결과

 

5. 참고




2015. 11.  19

최초 작성



2018. 10. 22

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

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



2021. 9. 25

Visual Studio 2019, OpenCV 4.5.3에서 테스트



1. MFC 응용 프로그램 생성

 

1-0. 새 프로젝트 만들기를 클릭합니다. 

 

 

1-1. MFC 앱을 선택하고 다음을 클릭합니다. ( Visual Studio 2019를 최근 버전으로 업데이트후 진행한거라 항목이 다를 수 있습니다.) 

 




1-2. 적당한 프로젝트 이름을 적은 후, 만들기를 클릭합니다. 

Visual Studio 2019 버전 16.11.3에선 에러가 발생하니  프로젝트 이름을 영어대소문자만으로 구성해야 합니다. 

 




1-3. 애플리케이션 종류를 대화 상자 기반으로 변경하고 마침을 클릭합니다. 

 




Visual Studio 2019 버전 16.11.3에서 프로젝트 생성시 다음과 같은 에러가 발생할 수 있습니다. 

COM 구성 요소 호출에서 HRESULT E_FAIL 오류가 반환되었습니다.





아래 포스트에 따로 작성한 구글에서 찾아본 방법들을 진행해보았는데도 해결이 안되어 혹시나해서 영어대소문자만으로 프로젝트 이름을 만드니 에러가 안납니다. 

확인한 바로는 _ 또는 빈칸을 프로젝트 이름에 추가한 경우 에러가 발생합니다. 


Visual Studio 2019 16.11.3에서 MFC 프로젝트 생성시 "COM 구성 요소 호출에서 HRESULT E_FAIL 오류가 반환되었습니다" 에러 발생
https://webnautes.tistory.com/1539 





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

 




1-4. 다음 포스팅을 참고하여 프로젝트에 OpenCV 관련 설정을 추가합니다. 9 ~ 19번을 진행하면 됩니다.

 

Visual Studio 2017/2019에서 OpenCV 4.5.3를 사용하는 방법

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로 변경합니다. 끝부분이 Dlg인 것을 선택하면 됩니다. 

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

 




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

 




3-4. OpenCVwithMFCDlg.h 파일에 OpenCV 헤더파일을 추가합니다. 

 

#include "opencv2/opencv.hpp" 

 

using namespace cv;

 

 

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

 

VideoCapture *capture;

Mat mat_frame;

CImage cimage_mfc;

 



3-6. OpenCVwithMFCDlg.cpp 파일의 OnInitDialog 함수에 코드를 추가합니다.

 

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);

 



3-7. OpenCVwithMFCDlg.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키를 눌러서 실행한 결과입니다.  현재 코드는 스크린샷과 달리 흑백으로 보입니다. 



3-7에서 다음 코드를 주석처리하면 컬러로 보이게 됩니다.


cvtColor(mat_frame, mat_frame, COLOR_BGR2GRAY);

 





5. 참고

 

http://stackoverflow.com/a/29006218   

 

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

 

https://stackoverflow.com/a/28525365

 

반응형

해본 것을 문서화하여 기록합니다.
부족함이 있지만 도움이 되었으면 합니다.


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


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

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. 이전 댓글 더보기
  2. thumbnail
    weenie
    2018.11.16 06:36

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

  3. thumbnail
    brad
    2019.02.01 10:32

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

  4. thumbnail
    2019.05.03 16:43

    비밀댓글입니다

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

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

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

  5. thumbnail
    김형동
    2019.05.19 14:27

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

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

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

    • thumbnail
      김형동
      2019.05.20 13:21

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

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

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

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

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

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

    • thumbnail
      김형동
      2019.05.20 19:23

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

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

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

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

    • thumbnail
      김형동
      2019.05.26 15:37

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

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

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

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

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

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

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

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

    • thumbnail
      흑흑
      2019.05.19 21:10

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

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

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

  7. thumbnail
    2019.05.19 21:40

    비밀댓글입니다

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

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

  8. thumbnail
    INeedU'rHelp
    2019.05.28 09:52

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

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

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

    • thumbnail
      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);

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

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

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

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

    • thumbnail
      INeedU'rHelp
      2019.05.28 12:37

      감사합니다.

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

  9. thumbnail
    jhp21c
    2019.06.01 22:11

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

    • thumbnail
      jhp21c
      2019.06.01 23:02

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

    • thumbnail
      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/

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

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

  10. thumbnail
    HYJ
    2019.07.15 17:03

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

    질문이 한가지 있는데요,

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

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

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

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

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

  11. thumbnail
    안녕하세요~
    2019.07.19 10:30

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

  12. thumbnail
    hi
    2019.07.19 10:49

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

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

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

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

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

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

    • thumbnail
      hi
      2019.07.19 14:40

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

    • thumbnail
      hi
      2019.07.19 15:13

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

      SetDIBitsToDevice(); 와
      StretchDIBits();

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

    • thumbnail
      hi
      2019.07.19 15:25

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

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

      해결되서 다행입니다 : )

  13. thumbnail
    help
    2019.09.24 13:36

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

  14. thumbnail
    Hong
    2019.12.03 10:18

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

  15. thumbnail
    하이랜더킴
    2019.12.17 23:28

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

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

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

  16. thumbnail
    하이랜더킴
    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

  17. thumbnail
    하이랜더킴
    2019.12.18 22:27

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

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

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

  19. thumbnail
    CV
    2020.08.06 13:32

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

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

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

    • thumbnail
      BlogIcon CV
      2020.08.06 15:07

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

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

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

  20. thumbnail
    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로 할때는 카메라 연결 잘됩니다.

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

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

    • thumbnail
      BlogIcon JY
      2020.10.19 10:17

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

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

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

    • thumbnail
      BlogIcon JY
      2020.10.19 10:53

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

    • thumbnail
      BlogIcon JY
      2020.10.19 12:01

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

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

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

      VideoCapture(0, CAP_DSHOW)

  21. thumbnail
    2021.09.16 09:16

    비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2021.09.16 09:42 신고

      디버그를 해보거나 로그를 출력해서 어느 부분에서 멈추는지 확인해봐야 할거 같습니다. 혹 메모리 점유율이 올라가는건 아닌지도 확인이 필요해보입니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2021.09.16 09:42 신고

      태스트 코드라 오랫동안 실행시켜 보지는 않았는데 문제가 있나보군요

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2021.09.25 22:02 신고

      Visual Studio 2019에서 10분 정도 테스트를 해봤는데 문제가 없었습니다.