반응형

OpenCvSharp을 타이머를 사용하여 PictureBoxIpI에 영상 출력을 하는 프로그램을 작성한 뒤

 

얼마안되서 영상이 멈추었다가 10초 정도 뒤에 다시 동작하는 현상이 발생하였다.

 

해당 현상을 해결하기 위해 메모리 너무 잡아먹지는 않는지..

 

CPU를 많이 사용하는지 확인하였지만 둘다 크게 상관이 없었다.

 

혹시나 해서 Gabage Collection을 사용하여 쓰레기 값을 수집하니... 멈춤현상이 생기지 않았다.

 

GC.Collect();
GC.WaitForPendingFinalizers();

 

이 두줄을 타이머가 돌아가는 Tick이벤트에 추가하여 해결하였다.

반응형

'개발언어 > C#' 카테고리의 다른 글

C# OCX DLL 못찾는 오류  (0) 2020.12.03
c# TCP 파일 전송 프로그램  (1) 2020.02.28
SetupApiDll.dll dll 못 찾는 오류  (0) 2020.02.26
OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
c# 쓰레드로 폼제어  (0) 2019.07.10
반응형
	/// <summary>
        /// 외부에서 장치들의 상태를 알아오는 함수를 호출 할 수 있는 모듈
        /// </summary>
        /// <param name="str"></param>
        /// <param name="len"></param>
        [DllImport("SetupApiDll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private static extern void GetDeviceInfo(StringBuilder str, int len);

        /// <summary>
        /// 장치들의 상태를 알아온다.
        /// </summary>
        /// <returns>장치들의 상태를 문자열로 돌려준다.</returns>
        public string GetDeviceState()
        {
            StringBuilder buffer = new StringBuilder(255);
            GetDeviceInfo(buffer, buffer.Capacity);
            return buffer.ToString();
        }

장치 정보가져오는 dll을 DllImport할 때 빌드한 컴퓨터에서는 동작이 잘되었지만

다른 컴퓨터에서 실행하니 dll을 찾을 수 없다는 오류가 발생하였다.

확인해보니 해당 dll을 참조하는 dll을 추가해 주어야 정상 동작하였다.

msvcpr100d.zip
0.74MB

설치 프로젝트를 만들 때 해당 dll들을 포함시켜 빌드하여 오류를 해결하였다. (zip파일 바이러스 검사하였음)

 

-------- 윈도우 시스템 폴더에 포함시켜도 동작하였다 ------

win 32bit 일 경우 C:\Windows\system32 폴더안에 복사

win 64bit 일 경우 C:\Windows\syswow64 폴더안에 복사

 

참고로 아래 사이트에서 무료로 특정 dll이 참조하는 다른 dll을 찾아주는 프로그램도 있다.

http://www.dependencywalker.com/

 

Dependency Walker (depends.exe) Home Page

Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, it lists all the functions that are exported by that modul

www.dependencywalker.com

노란색 ? 동그라미로 표시된 dll이 없는 dll이라는 것을 알 수 있다.

반응형
반응형

카메라 출력에 EmguCv를 사용하였다가 밝기 조절 하는 기능이 적용되는 컴퓨터와 그렇지 않은 컴퓨터가 있었고,

 

DirectShow로 카메라 정보를 가져올 때 인덱스 0번을 가져오면 EmguCv 객체에서는 1번을 가져와서 2대 이상의 카메라에는 혼돈이 생겼다.

 

그래서 OpenCvSharp으로 Dll를 급변경 하였고, Debug빌드 테스트 문제가 없어 바로 Setup프로젝트로 만들고 설치 후 실행하였지만 카메라 출력시 오류가 발생해 프로그램이 종료되는 문제가 발생했다.

 

오류를 출력한 결과 OpenCvsharp.Mat의 형식 이니셜라이저에서 예외를 Throw했습니다. 라는 문구를 확인하였고, 

Nuget에서 설치시 패키지에 들어있던 runtimes\win-x86\native 폴더에 있는 OpenCvSharpExtern.dll을

Setup프로젝트에 포함시켜 빌드하니 잘 동작하였다.

 

OpenCvSharp은 이문제만 해결하면 DirectShow와 객체생성할때 쓰는 인덱스와 일치하고, Camera.Brightness 에 값만 대입해주면 밝기 조절도 가능하였다.

 

EmguCv를 여태까지 잘 써왔지만 많이 부족한 것 같다.

그래도 지금도 계속 업데이트 중이니 확인을 계속 해야겠다.

반응형
반응형

달, 일 범위 체크 후 범위내에 있으면 true리턴 없으면 false리턴

private bool CheckVaildDate(string strDate)
        {
            if (strDate.Length != 8)
                return false;

            string strMonth;
            string strDay;

            strMonth = strDate.Substring(4, 2);
            strDay = strDate.Substring(6, 2);

            int nMonth = Convert.ToInt32(strMonth);
            int nDay = Convert.ToInt32(strDay);

            if (nMonth < 1 || nMonth > 12)
            {
                return false;
            }

            if (nDay < 1 || nDay > 31)
            {
                return false;
            }

            return true;
        }
반응형
반응형

메인 쓰레드가 아닌 새로운 쓰레드로 폼과 컨트롤들을 제어하려고 하면 크로스 쓰레드 에러가 발생한다.

InvokeRequired로 현재 쓰레드가 메인쓰레드와 충돌이 되는지 확인하고 Invoke()메서드로 대리자를 생성해준다.

 

필자의 경우는 폼을 Hide()메서드를 사용해 잠시 숨겼다가 쓰레드로 Show()메서드를 사용할 때

에러가 발생하여 처리한 경우이다. 닷넷 버전이 올라가면서 this는 안써줘도 됨으로 생략하였다.

 

InvokeRequired는 주로 텍스트 박스같은 컨트롤에도 사용할 수 있다.

텍스트 박스같은 경우는 주로 채팅프로그램에서 쓰레드를 써야할때 쓰므로 아주 유용하다.

ex) if (textbox1.InvokeRequird) textbox1.Invoke(new ...

if (InvokeRequired) //만든 쓰레드가 메인 쓰레드와 충돌할때
{
	Invoke(new MethodInvoker(delegate ()
	{
		Show();
	}));
}

else
{
	Show();
}
반응형
반응형

이미지를 메모리스트림에 넣었다가 ToArray() 메서드를 사용해 바이트 배열로 만든다.

가운데 using을 쓴 이유는 메모리 스트림 객체는 생성하고 리소스 할당 해제를 Dispose() 메서드로 해주는데, using을 쓰면 중괄호 블럭에서 벗어나면 자동으로 할당 해제가 된다.

public static byte[] ImageToByteArray(Image image) //이미지를 바이트배열 변환
{
	using (var ms = new MemoryStream())
	{
		image.Save(ms, ImageFormat.Jpeg);
		return ms.ToArray();
	}
}

private Bitmap byteArrayToImage(byte[] imgbytes) //바이트를 이미지배열로 변환
{
	using (var ms = new MemoryStream(imgbytes))
	{
		Bitmap img = Image.FromStream(ms) as Bitmap;
		return img;
	}
}
반응형

'개발언어 > C#' 카테고리의 다른 글

OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
c# 쓰레드로 폼제어  (0) 2019.07.10
c# 마우스 드래그로 폼이동하기  (0) 2019.07.10
c# Form에서 ALT+F4 막기  (0) 2019.07.10
c# 폴더(디렉토리) 생성 후 삭제하기  (0) 2019.06.28
반응형
private Point mousePoint;     //현재 마우스 좌표를 저장할 전역변수 선언

//코드는 예시로 디자인에서 FormBorderStyle을 None으로 설정한다.
FormBorderStyle = FormBorderStyle.None;

//LableTitle이라는 레이블 컨트롤 생성 후 마우스 다운 이벤트와 무브 이벤트 생성
private void LableTitle_MouseDown(object sender, MouseEventArgs e)
{
	mousePoint = new Point(e.X, e.Y); //현재 마우스 좌표 저장
}

private void LableTitle_MouseMove(object sender, MouseEventArgs e)
{
	if ((e.Button & MouseButtons.Left) == MouseButtons.Left) //마우스 왼쪽 클릭 시에만 실행
	{
		//폼의 위치를 드래그중인 마우스의 좌표로 이동 
		Location = new Point(Left - (mousePoint.X - e.X), Top - (mousePoint.Y - e.Y));
	}
}
반응형
반응형
//폼 생성자 부분이나 폼 로드 이벤트에 추가하면 어떤 컨트롤에서 키를 눌러도 먼저 폼에 접근한다.
KeyPreview = true; 

//Form에 KeyDown이벤트 핸들러를 추가해서 ALT + F4로 폼이 종료되는것을 막기
private void Form_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if(e.KeyData == (Keys.Alt | Keys.F4)) 
        e.Handled = true; 
}

 

반응형

+ Recent posts