2010-06-25 4 views
2

dshownet (처음)과 C#을 사용하고 있습니다. 웹캠 입력을 받아 양식에 표시 할 샘플이 있습니다. 이제 마우스를 사용하여 비디오 스트림 위에 직사각형을 그려야합니다. (의도는 상자 안의 내용을 추적하는 것입니다.)마우스를 사용하여 비디오 스트림의 채워지지 않은 상자에 그리는 방법

VMR이라는 것이 있다고 들었습니다. 그래서 나는 dshownet 샘플에 가서 그들을 통과했다. 마우스를 사용하여 비디오 스트림의 모양을 오버레이하는 샘플을 찾지 못했습니다. 여기에있는 누군가가 컬러 키를 사용하도록 제안했습니다. 다른 사람은 GDI + 및 마우스 조작을 사용한다고 말했습니다. 나는 DXLogo 샘플을 컴파일하려고하지만,이 오류가있어 : 1 추상 클래스 또는 인터페이스 'System.Drawing.Image'C의 인스턴스를 만들 수 없습니다


오류 : \ 문서 및 설정 \ TLNA \ 바탕 화면 \ 결승 코드 섹션 DxLogo \ Capture.cs 128 32 DxLogo 2008


\ 년도 프로젝트 \ 라이브러리 \ DirectShow를 라이브러리 2 \ DirectShowSamples 2010 월 \ 샘플 \ 캡처 :


if (fileName.Length > 0) 
      { 
       m_Bitmap = new Image(fileName); // error happened here 

       Rectangle r = new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height); 
       m_bmdLogo = m_Bitmap.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
      } 

내가 Bitmap9 인터페이스를 통과해야한다는 것을 알고 있습니다. 그러나 나는 어디에서 시작 해야할지 정말로 모른다. DirectShow API 문서를 읽어야합니까?

btw 디지털 비디오 및 TV 용 프로그래밍 Microsoft Directshow도 있습니다. 나는 그 책을 읽기 시작했고 코드가 주로 C++이기 때문에 몇 페이지 뒤에서 멈췄다. 이 책을 계속 읽어야하나요? C#에서 특정 언급 된 작업을 어떻게 수행 할 수 있습니까?

동영상을 그리는 방법에 대한 제안. 유용한 링크 (자습서)가 도움이 될 것입니다.

많은 감사 Tlna

답변

1

나는 DirectShow를 샘플이 컴파일되지 않는 이유를 잘 모르겠지만, 당신은 문제가있는 라인을 변경할 수 있습니다 : 이것에

m_Bitmap = new Image(fileName); 

:

m_Bitmap = new Bitmap(fileName); 

그리고 작동 시키십시오.

실제로 여기에서 꽤 어려운 문제에 직면 해 있습니다. DirectShow는 일련의 스틸 프레임을 (프레임 속도에 관계없이) 초당 몇 번씩 장치 컨텍스트 (예 : PictureBox 또는 Form 또는 화면)에 그리는 방식으로 비디오를 렌더링합니다. 개발자 (프로그래머)는 그래픽을이 동일한 장치 컨텍스트에 직접 (쉽게) 렌더링 할 수도 있습니다.

그러나 그려진 상자를 실행중인 비디오 위에 표시하려면 DirectShow가 비디오의 각 프레임을 그려 본 직후 코드에서 사각형을 그려야합니다. 그렇지 않으면 다음 프레임에서 직사각형이 제거됩니다. DirectShow 개체에는 처리 할 수있는 일종의 프레임 렌더링 이벤트가있을 것입니다. 이벤트 처리기에서 상자를 다시 그립니다 (초기 및 현재 마우스 좌표를 기반으로 MouseDown 및 MouseMove 이벤트에서 얻을 수있는 당신이 그리는 컨트롤).

업데이트 : 나는 DirectShow에서 놀고있을 때부터 내 코드를 살펴 보았습니다.NET을 클릭하면 박스를 그릴 수있는 이벤트 (DsEvCode.Repaint)가있는 것처럼 보입니다.

난 당신이 작업중인 코드 샘플 보았다,하지만 당신은 이런 식으로 뭔가를 추가 할 수 있어야합니다, 검색을하고 당신이 당신의 코드에 OnGraphNotify() 방법을 찾을 수 있는지 확인하지 않은 :

if (code == DsEvCode.Repaint) 
{ 
    // draw the box here 
} 

아마도이 이벤트는 동영상의 각 프레임이 렌더링 된 후에 시작됩니다. 따라서 상자가 계속 유지되는 것처럼 매번 상자를 다시 그릴 경우이 이벤트가 발생합니다.

관련 문제