2008-10-24 3 views
22

웹캠에 연결하고 이미지 조작을 위해 C#으로 프로그램을 만들고 있습니다. 나는 웹캠에 연결하고 그것을 클립 보드에 보내는 메시지를 보내기 위해 win32 api (avicap32.dll)를 사용하는 작동하는 응용 프로그램을 가지고 있습니다. 문제는 페인트에서 액세스 가능하지만 프로그램에서이를 읽으면 null 포인터가 생성된다는 것입니다. C#의 웹캠 사용법

내가 웹캠을 연결하는 데 사용하는 코드입니다 :

mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 1024, 0); 

SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0); 
SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0); 

을 그리고 이것은 내가 클립 보드로 이미지를 복사하는 데 사용하는 것입니다 :

SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0); 

SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0); 
tempObj = Clipboard.GetDataObject(); 
tempImg = (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap); 

내가 가진 일부 오류 검사를 Theres는 코드에서 제거하여 더 짧게 만들었습니다.

답변

17

저는 최근이 분야에서 취미 활동을 시작했습니다.

opencvdotnet 랩퍼가있는 OpenCV 라이브러리를 사용하여 합의했습니다.

using (var cv = new OpenCVDotNet.CVCapture(0)) 
{ 
    var image = cv.CreateCompatibleImage(); 
    // ... 
    cv.Release(); 
} 

을 그리고 당신은 이미지 조작을 수행하는 경우, OpenCV의의 이미지 처리 알고리즘은 OpenCVDotNet.Algs 어셈블리 내에서 포장 한 : 그것은 웹캠에서 프레임을 캡처 지원합니다.

이 경로를 선택하는 경우 Vista 64 비트 또는 "mklink OpenCV"c : \ program을 사용하는 경우 OpenCV 버전 1.0을 설치하고 "c : \ program files \ opencv"에 설치하십시오. files (x86) \ OpenCV` "를 올바른 디렉토리에서 가져 오지 않으면 opencvdotnet이 설치되지 않습니다.

+0

고마워요! Visual C++ 2005 Express를 설치 한 신비한 오류에 대해 Microsoft가 저주 한 후이 경로를 따라갔습니다. 이제는 멋지게 작동합니다 :) 재배포 가능 패키지가 작동하지 않는 이유는 anyones로 추측됩니다 ... –

+4

OpenCV.NET은 더 이상 적극적으로 관리되지 않으며, OpenCV.NET에 운이 없다면 Emgu CV를 사용해보십시오. –

0

: 사전에

감사합니다 당신이 Clipboard.GetImage를 시도()? 또한 다양한 Clipboard.Contains *() 메서드를 사용하여 데이터가 클립 보드에 저장된 형식을 확인할 수도 있습니다.

+0

나는 그것을 시도했다. 또한 null을 반환합니다 –

6

실제로 응용 프로그램, DirectShow 및 WIA로 카메라 데이터를 가져 오는 두 가지 방법이 있습니다. WIA을 사용하고 WIA 용 인터페이스를 사용하면 두뇌를 감싸는 것이 매우 간단합니다. 나는 전에했던 작업을 토대로 오픈 소스 WIA desktop library을 만들고 발표했습니다.

이제 WIA의 문제점은 너무 간단하다는 것입니다. 예를 들어, 프레임 속도, 해상도 등의 카메라 속성을 조정하려면 WIA가 떨어집니다. Microsoft는 DirectShow를 더 이상 사용하지 않지만 모든 기능을 갖춘 대체품을 제공하지는 못했으며 모든 기존 플랫폼에서 계속 잘 작동한다는 것을 알았습니다. (매우 견고하여 지원이 사라지는 것을 상상할 수 없습니다. 곧).

매우 좋은 DirectShow library over at SourceForge가 있습니다. DShow가 복잡하고 혼란 스럽다는 사실에서 비롯된 유일한 "문제"는 실제로 복잡합니다. 래퍼가 수행 할 수있는 많은 작업이 있지만 쉽게 해결할 수는 없지만 비디오를 표시하거나 프레임을 캡처하는 것과 같은 일반적인 사용 사례에 대한 샘플을 제공합니다. 오버레이를 추가하거나 다른 필터를 삽입하려는 경우 오버레이를 수행 할 수 있지만 그다지 간단하지는 않은지 미리주의하십시오.

+0

사실, DirectShow는 요즘 Windows Vista 및 7을 사용하는 방법이며, 가장 최근의 Windows 버전에 추가 된 새로운 기능으로 인해 더 이상 사용되지 않습니다. – Jonas

0

OpenCV의 캡처, EMGU 캡처 나는
모든 시도 다른 모든 캡처 라이브러리는 같은 문제가 있습니다 : 당신은 (윈도우 비디오 소스 창을 열지 않고) 640x480 이상 프로그래밍 방식
을 갈 수 없습니다.
https://github.com/ofTheo/videoInput

0
이것은 또한 How to get web cam images in C#?에 요청했다

다음과 같은 유용한 찾을 수 있습니다 (스팸에 대한 미안하지만,이 정말 질문에 대답하는 데 도움) :

나는 (작업을 수행하는)이을 사용하는 것이 좋습니다

방금 ​​내 Windows 앱 CamTimer (.NET/C#으로 작성)의 전체 소스 코드를 공개했습니다. 전체 코드 다운로드 /보기 (웹캠 예제 사용) https://github.com/johanssonrobotics/CamTimer

해피 코딩!