| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- Linux
- Visual Studio Code
- atmel
- Arduino
- Raspberry
- raspberrypi
- vscode
- 아두이노
- C++
- 디버깅
- c#
- yocto
- bare metal
- cpp
- buildroot
- 라즈베리파이
- STM32
- Visual Studio
- AArch64
- UART
- Debugging
- GPIO
- avr-gcc
- QEMU
- 회로
- nucleo
- WPF
- esp32
- AVR
- Debug
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[MediaFoundation] C++로 연결된 카메라 나열 본문
- 개발 환경
Visual Studio 2026 (18.3.1)
- 참고자료
Media Foundation 프로그래밍 가이드
https://learn.microsoft.com/ko-kr/windows/win32/medfound/media-foundation-programming-guide
Media Foundation 헤더 및 라이브러리
https://learn.microsoft.com/ko-kr/windows/win32/medfound/media-foundation-headers-and-libraries
마이크로소프트 Media Foundation 공식 예제 코드
https://learn.microsoft.com/ko-kr/windows/win32/medfound/audio-video-capture-in-media-foundation
- 예제 코드
https://github.com/MainForm/MediaFoundation_CPP_ShowCameraDeviceName
GitHub - MainForm/MediaFoundation_CPP_ShowCameraDeviceName
Contribute to MainForm/MediaFoundation_CPP_ShowCameraDeviceName development by creating an account on GitHub.
github.com
1. 서론
영상처리 관련 개발자들은 대부분이 OpenCV를 사용할 것으로 예상합니다. 영상 처리를 위한 대부분의 기능들이 포함되어 있으며 더구나 VideoCapture를 통해 아주 손쉽게 카메라에 접근할 수 있어 특히 많이 사용하는 것 같습니다. 단, 딱 하나 문제가되는 부분이 있습니다. 카메라에 대한 자세한 정보를 제공해 주지 않는 다는 것과 세세한 설정을 할 수 없다는 것입니다. 내가 사용하려는 카메라의 모델 정보나 사양들을 확인하기 힘들기에 카메라 제조 회사에서 제공해주는 API를 사용합니다.
윈도우에서는 카메라나 오디오를 개발 하기위한 MediaFoundation 라이브러리를 제공해주고 있습니다. 해당 라이브러리는 윈도우에서 동영상 플레이어를 개발하기 위해 많이 사용되며 이에 따라 비디오에 인코딩, 디코딩에 대한 기능도 지원합니다. 이러한 라이브러리르 통해 컴퓨터에 연결된 카메라를 열거하는 프로그램을 개발해보도록 하겠습니다.
2. 라이브러리 연결
먼저 MediaFoundation을 사용하기 위해 아래와 같은 Lib파일을 프로젝트에 연결해야합니다. 기능에 따라서는 추가적인 Lib파일이 필요하지만 단순히 카메라 장치를 나열하기 위해서는 아래 Lib 파일로도 충분합니다.
mfplat.lib
mfuuid.lib
mf.lib
mfreadwrite.lib



3. 프로그램 개발
#include <iostream>
// MediaFoundtion 헤더파일
#include <mfapi.h>
#include <mfobjects.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#include <mferror.h>
using namespace std;
// https://learn.microsoft.com/ko-kr/windows/win32/medfound/audio-video-capture-in-media-foundation
void showDeviceNames(IMFActivate** ppDevices, UINT count)
{
for (DWORD i = 0; i < count; i++)
{
HRESULT hr = S_OK;
WCHAR* szFriendlyName = NULL;
// 카메라 이름 정보 도출
UINT32 cchName;
hr = ppDevices[i]->GetAllocatedString(
MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME,
&szFriendlyName, &cchName);
if (SUCCEEDED(hr))
{
wprintf(L"%d : %s\n", i, szFriendlyName);
}
CoTaskMemFree(szFriendlyName);
}
}
int main(void) {
// COM 라이브러리 초기화
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
// MediaFoundation 라이브러리 초기화
MFStartup(MF_VERSION, MFSTARTUP_FULL);
IMFAttributes* pConfig = NULL;
IMFActivate** ppDevices = NULL;
UINT count = 0;
// 카메라 검색 속성을 저장하기 위한 객체 생성
HRESULT hr = MFCreateAttributes(&pConfig, 1);
// 카메라 검색 속성 지정
// 카메라 디바이스를 검색(SOURCE_TYPE_VIDCAP)
if (SUCCEEDED(hr))
{
hr = pConfig->SetGUID(
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
);
}
// 카메라 디바이스 도출
if (SUCCEEDED(hr))
{
hr = MFEnumDeviceSources(pConfig, &ppDevices, &count);
}
// 카메라 정보 출력
showDeviceNames(ppDevices, count);
// 카메라 정보 객체 해제
for (UINT i = 0; i < count; i++) {
ppDevices[i]->Release();
}
CoTaskMemFree(ppDevices);
// 카메라 검색 속성 객체 해제
pConfig->Release();
// MediaFoundation 라이브러리 해제
MFShutdown();
// COM 라이브러리 해제
CoUninitialize();
return 0;
}

주의 사항)
MediaFoundation의 카메라 순서와 OpenCV의 CaptureVideo의 카메라 순서가 같다고 보장하지 않습니다.
위 코드가 가독성이 떨어지므로 life time을 그림으로 그렸습니다.

4. 결론
카메라의 이름이 잘 나열 된 것을 확인하였습니다 .이제 해당 카메라의 스트림에 접근하여 카메라에서 프레임을 획득하는 코드를 작성할 필요가 있습니다. 해당 코드에 대해서는 다음 포스트에서 작성하도록 하겠습니다.