2011-09-22 2 views
1

이 시점에서 카메라 인터페이스에서 이미지를 호출하는 기능이 있습니다. 이 이미지는 하드 드라이브에 저장되고 Windows Forms GUI에도 표시됩니다.C#에서 Emgu.CV를 사용하는 System.TypeInitializationException

이미지를 반환하는 카메라 인터페이스 내부의 함수는 다음과 같습니다. 높이와 너비는 모두 카메라 인터페이스 클래스의 일부인 정수입니다. 이 경우에는 800x600으로 설정되었습니다.

프레임을 캡처하는 데 비교적 오래 걸리는 기능을 여러 번 호출하면 몇 초 동안 프로그램이 사용되지 않게됩니다. 그런 다음, 비주얼 C# 2010 디버그에서 프로그램을 실행하는 동안 몇 프레임을 캡처 한 후, 윈도우 오류가 vshost.exe에 대한 팝업 :

Faulting application DashboardGUI.vshost.exe, version 10.0.30319.1, time stamp 0x4ba2084b, faulting module MSVCR90.dll, version 9.0.30729.6161, time stamp 0x4dace5b9, exception code 0xc0000005, fault offset 0x00024682, process id 0xe78, application start time 0x01cc792086025f01. 

나는 다음 응용 프로그램을 게시하고 실행 파일에서 실행하는 것을 계속하고 있어요 오류 :

Application: DashboardGUI.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.TypeInitializationException 
Stack: 
    at Emgu.CV.CvInvoke.cvReleaseCapture(IntPtr ByRef) 
    at Emgu.CV.Capture.DisposeObject() 
    at Emgu.Util.DisposableObject.Finalize() 

그러나 나는이 또한 Emgu.CV.CvInvoke.cvCreateCameraCapture (INT32)와 같은 예외를 발생했다.

이러한 문제의 원인은 무엇입니까? 어떻게 피할 수 있습니까? 그리고 프레임을 현재 캡처하는 것보다 빠르게 캡처하는 방법이 있습니까 (충돌하지 않을 때)?

답변

3

코드를 살펴본 결과 문제가 발생했습니다. 내가 예상했던 충돌 이유는 내가 미안하다고 말하는 성명서 때문입니다. 사용법이 정확하지 않습니다. 시스템이 처리 할 수있는 코드에 자주 액세스하는 것으로 보입니다.

Capture cap = new Capture() 

소량의 코드에 대해 많은 양의 작업이 수행됩니다. 카메라와의 통신을 설정하고 존재 여부를 확인하고 드라이버를 처리하고 링 버퍼 등을 생성 할뿐만 아니라 업데이트 된 이미지 만 제공되도록하는 동안 버튼이나 타이머를 사용하는 경우 일반적으로 제대로 작동합니다. 시간 지연. 이제는 당신이 성취하고자하는 것과 당신이이 방법으로 합리적으로 달성 할 수있는 것보다 더 규칙적으로 이미지를 원하기 때문에 당신은보다 실용적인 선택을 할 수 있습니다.

캡쳐 장비를 전역으로 설정하고 필요할 때마다 버퍼에서 이미지를 가져 오기 위해 녹음 및 호출 ProcessFrame을 설정하십시오. 이제 방금 얻은 프레임을 복사하기 위해 QueryFrame을 변경하십시오. 이렇게하면 이전 프레임을 가져 오는 문제를 막을 수 있으며 버퍼에서 가장 최근 프레임을 가져옵니다. 나는이 때이 정말 도움이 -이

private Capture cap; 
Image<Bgr, Byte> frame; 

public CameraCapture() 
{ 
    InitializeComponent(); 
    cap= new Capture(); 
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, height); 
    cap.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, width); 

    Application.Idle += ProcessFrame; 
} 

private void ProcessFrame(object sender, EventArgs arg) 
{ 
    frame = _capture.QueryFrame(); 
    grayFrame = frame.Convert<Gray, Byte>(); 
} 

public Image<Bgr,byte> QueryFrame() 
{ 
    return frame.Copy(); 
} 

희망

건배를, 솔루션에 소용했다이 시간, 미안 다른 방법을 당신을 얻을 크리스

+0

아, 네가 필요로하는 것에 대해 이것이 효과가 있다고 상상해 보라! 최신 이미지를 반환하면서 프레임을 빠르게 검색 할 수 있습니다. 곧 구현할 것입니다. Chris에게 다시 한 번 감사드립니다! – DArren

+0

그것은 최신 프레임을 완벽하게 캡처합니다! 시스템 지연은 1600x1200에서 실행될 때 멈출 수 없다고 가정합니다 (때로는 해당 해상도에서 프레임을 캡처하고 싶습니다)? – DArren

+0

불행히도 당신이 프로세서를 오버 클럭하지 않고 비싸지 않은 빠른 오류 램을 사용하지 않는 한 실제로는 그렇지 않습니다. net parallel toolbox가 For 또는 Foreach 루프를 빠르게 처리 할 수 ​​있는지에 따라 분석 속도를 향상시킬 수 있지만 사용하기 쉽고 구현하기 쉽습니다. http://msdn.microsoft.com /en-us/library/dd460693.aspx 다행히 그것은 결국 당신을 위해 일했습니다 :) 건배 – Chris

관련 문제