이번장에서 알아볼것은 opencv를 통해 c#에서 영상을 어떻게 처리하는지 알아볼것이다.
opencv(Open Source Computer Vision Library)가 먼지 간략하게 설명하자면,
크로스플랫폼(Windows, Linux, OS X(Mac),iOS,Android) 과 실시간 이미지 프로세싱에 중점을 둔 라이브러리로서 상업적 사용이 무료이다.(가장 큰 장점)
처음에 Gary Bradsky라는 사람에 의해 1996년 인텔이 개발을 주도했으나, 지금은 인텔은 손을 완전히 뗀 상태고, 이후 Vadim Pisarevsky, Stanley, Willow Garage등 많은 사람들이 이 프로젝트를 리딩했었고,
C언어만 지원했던 1.x버전에서 2.x버젼부터는 스마트 포인터 스타일을 활용해 c++을 지원하기 시작했고, 과서 C스타일(IpIImage)의 코드는 현재 레거시로만 남아있는데 여전히 잘동작은 한다. Python을 공식 지원한 이래 현재는 라이브러리쪽이 C++보다 파이썬이 가장 먼저 나올만큼 파이썬에서 대세로 자리잡고있는 추세이다. 특히 , 요즈음 딥러닝 관련 프로그래밍이 파이썬으로 진행되면서 opencv 파이썬 라이브러리 사용빈도가 매우 늘었다.
이 같은 현장의 가장 큰 이유는 픽셀단위의 접근이 빈번하게 이뤄진다면 당연히 C++이 빠르긴 하지만 딥러닝처럼 단순한 매트릭스 연산을 할경우 numpy와 opencv의 궁합이 엄청나게 좋아서 월등히 편리하기 때문이다.
또한 라이브러리 인터페이스가 버젼별로 C++과 달리 상이하지않고 안정적이여서 파이썬에서 월등하다.
c# 프로그램에서는 이번장에서 opencv 랩핑 라이브러리인 opencvsharp으로 대체할 것이다. opencv는 크로스플랫폼에 대단히 강점으로 거의 모든 언어에 가능하다고 보면 된다.
BSD라이선스를 사용해서 무료로 상업적으로 사용해도 무료이다. 이 때문에 특별히 어려운 영상처리는 유료로 유명한 MIL등을 쓰긴하지만 거의 대부분의 영상처리에서 사용한다고 해도 과언이 아닌다. 영상처리가 조금이라도 들어간다면, 필수적으로 사용하는 라이브러리라고 봐도 무방하다. 기능이 매우 방대해서 opencv에 있는것을 왠만ㅁ큼만 다 사용할줄 알아도 영상처리 고수라고 해도 과언이 아닌다. 응용방법이 매우 방대하다.
주요 알고리즘으로
이진화(binarization)- 주로 길이같은거 재거나 엣지 같은 형태 추출할때 사용많이함.
노이즈 제거(noise removal) -선형 및 비선형 이미지 필터링 같은
외곽선 검출(edge detection)
패턴 인식
기계 학습(machine learning)
ROI(Region of Interest)설정 - 색 공간 변환, 히스토그램등 같은
이미지 변환(image warping)
하드웨어 가속
등이 있다.
이번장에서 c# 프로그램으로 opencv를 알아볼것은 opecv를 c#용으로 래핑할 opencvsharp으로
진행할것이다.
우선 첫번째,
c# 프로그래밍에서..
opencvsharp을 쓰는 이유
앞에서 설명하다 시피 opencv가 크로스플랫폼을 지원해서 거의 모든 언어로 가능
(ios랑 android면 자바와 object-c같은 언어도 지원하는거니)
한데 opencvsharp을 쓰면 함수이름이 거의 똑같은걸 써서 서로 포팅하기가 너무 편하기 때문이다.
그리고 무엇보다 상업적으로 사용해도 무료인데다가 완성도도 굉장히 높아서 쓸수밖에 없다
물론 정말 정밀한 작업할때는 현장에서 MIL도 많이 쓰긴한다.
포팅할때 함수를 참고할때는
shirt.github.io 여기 사이트 참고하면.
위와 같이 거의 모든 함수들에 대해 자세히 설명하고 있다.
필요할때 찾아보시면 매우 유리하다.
이제 다음으로,
opencvsharp 초기 설정
우선 비쥬얼스튜디오에서
도구-> nuget패키지 관리자 -> 솔루션용 nuget패키지 관리에서 opencvsharp을 찾아서 설치.
4.0버젼 깔아도 되고 4.4버젼깔아도 상관은 없다.
예제에서는 4.0버젼을 깐 코드이다. 그런데 4.4도 테스트해보니 함수가 더 정밀하게 랩핑된 느낌이라 되도록 4.4 쓰기를 대신에 opencv용 pictureboxIpI이 없어지고 그냥 picturebox를 사용해야 되는게 다르긴 하다.
우선 패키지 설치가 끝났으면 ,
using 함수를 통해 라이브러리를 활성화 시키고,
using OpenCvSharp;
기본적으로 카메라의 영상을 가져오는거 테스트.
picturebox와 timer , 그리고 영상 가져올거 테스트할 버튼하나를 디자이너에 배치후.
버튼 더블 클릭해서 이벤트 생성 후,
카메라 영상 가져올 전역변수 두개 생성
이제 버튼을 누르면 영상을 가져올 버튼 이벤트 코딩
VideoCapture(0)의 안에 0의 의미는 내장 카메라 0번 영상을 가져오겠다는 의미인데
http:로 된 영상을 가져오려면 아래와 같이 하면 된다.
vc = new VideoCapture(string.Format("http://192.168.0.23:8090/?action=stream");
위의 예제는 mjpgstreamer라는 패키지로 카메라를 동작시켰을때 가져오는것인데 이건 머 웹서버로 영상 송출하는 장비 어디서든 응용이 가능하다.
그다음에 타이머가 무슨 역활을 하냐면 마치 프레임처럼 몇밀리세컨드 마다 가져와서 영상처럼 보이게 한다. ㅋ딩은 아래와 같이 하면 된다.
위와 같이 코딩을 하면 이제 영상을 가져와서 편집할 준비가 된것이다.
물론 그냥 cv2.imRead()함수로 그냥 사진파일하나 읽어와서 테스트해도 되긴하는데
재미없지않나. 실시간 영상으로 테스트해야지.
c# 프로그래밍에서 얼마나 끊기지 않고 자연스럽게 할수 있는지 알수도 있고.
다음장에서 본격적으로 opencvsharp을 응용해서 코딩하는걸 시작해본다.
딥러닝을 이용해 영상처리까지 아마 긴 여정이 될거같다.
'C# 윈도우 프로그래밍' 카테고리의 다른 글
Geometric model finder C#(2) (0) | 2022.12.17 |
---|---|
Geometric model finder C#(1) (0) | 2022.12.17 |
AI 딥러닝 objectdetection YOLO c# 프로그래밍 (0) | 2022.12.11 |
Opencvsharp 탬플릿 매칭 c# (template Matching) opencv (0) | 2022.12.11 |
opencvsharp 실시간 마우스 처리 opencv c# (0) | 2022.12.11 |