OpenCV 와 MFC를 이용한 본격적인 필터 프로그램을 제작하기 시작했습니다.

https://drive.google.com/open?id=0B3mC_hyBIvc8dXk1bXN4QW1sYmc


이전 버전에 비해, 본격적인 프로그램의 냄새가 살짝 나기 시작했습니다.

프로그램은 파일 열고 필터 선택 후 저장하는 아주 단순한 구성으로 되어 있으며,
가볍게 갖고 노는 용도로 사용을 권장합니다.
니파 필터 A는 원본 + 색상에 대한 균등화 이며 (비율로 구분됩니다)
니파 필터 B는 원본 + 밝기에 대한 균등화 입니다.


 
 
알려진 오류
 
//////////////////
 
https://www.microsoft.com/ko-kr/download/details.aspx?id=40784
msvcp120.dll 오류가 나실 경우,
Visual Studio 2013용 Visual C++ 재배포 가능 패키지를 설치하셔야 될 수도 있습니다.
 
//////////////////




프로그램 실행 화면입니다.
 


이미지를 넣은 화면입니다.
 
 
 
원본 이미지와, YCrCb 에 의한 히스토그램 균등화, RGB에 의한 히스토그램 균등화를 실행시키는 간단한 프로그램입니다.
 
MFC와 OpenCV 를 이용한 배포가능성에 의의가 있습니다 ㅇㅅㅇ..
 
 
 
이미지 로딩하는법을 알아낸다고 헤맨 시간만 ㄷㄷㄷ
 
MFC를 처음하는 만큼 어려웠습니다 ㅠㅠ..
 





다운받기
 




OpenCV 3.0 의 Seamless Cloning 이라는 기능을 이용하여 개발한
 
Simple 이미지 합성 프로그램 입니다.
 
 
 
 
 
MFC에서 마우스 클릭 마다 합성될 이미지의 위치를 변경하는 기능 구현에 애를 먹었네요.
 
 
 
 
 
p.s 배경이미지는 합성될 이미지 보다 더 커야 됩니다.
 
현재로서는 합성될 이미지의 배경이 단순하고, 하얀색일수록 제대로 된 결과물이 나옵니다.
 
 
 
 
 
간단한 예시를 든다면
 
구글에서 갖고 온, 두 이미지를 이용하여,
 


합성해보면



이런식으로 만들어 줍니다.





http://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/

이 글을 참조하여 개발하였습니다.





프로그램 다운

https://drive.google.com/file/d/0B3mC_hyBIvc8cExDRFdtVkZQTnc/view?usp=sharing




Cascade 학습을 할려면 먼저 인식하고자 하는 특정 물체의 이미지들이 필요합니다.

1. 이미지 안에서 물체의 좌표를 얻는 방법
2. 이미지 자체에 물체만 남겨놓는 방법

이 두가지를 생각했고, 2번 방법이 더 편할것이라 생각하였습니다.
일단 이미지 자체에 물체만 남겨놓았다면, 남은 것은 이미지 해상도를 구하면 그게 특정 물체의 좌표를 가리키는 것이니까요.

positive 와 negative 를 선택할 수 있으며,
각각 positives.txt 와 negatives.txt 파일을 생성합니다.

positives.txt 파일에는 이미지 경로, 1 0 0 이미지 폭, 이미지 높이 를 출력하며,
negatives.txt 파일에는 이미지 경로만 출력하게 됩니다.



이런 프로그램이 없지는 않을텐데, 찾는 수고 보다, 제작하는 게 더 빠를꺼 같아서 만들었습니다;;



https://github.com/nipa0711/PrintImageWH

에서 소스코드를 보실 수 있으며, 자유롭게 이용가능합니다.

OpenCV 를 이용하여 개발되었습니다.


인공지능 과목 마지막 프로젝트

제안서 제작 기간 : 2016/11/12 ~ 11/24
PPT 제안서 : https://drive.google.com/file/d/0B3mC_hyBIvc8SXZmUzB6MUpWVms/view?usp=sharing

프로젝트 제작 기간 : 2016/11/24 ~ 12/08
PPT 결과 보고서 : https://drive.google.com/file/d/0B3mC_hyBIvc8aWFISEtnT016UG8/view?usp=sharing

소스코드 : https://github.com/nipa0711/Motorcycle-detection

테스트 데이터 : https://drive.google.com/file/d/0B3mC_hyBIvc8UHhxUUFnd19ndzQ/view?usp=sharing



최종 결과 영상



/////////////////////////////////////////////////////////////////////////////////////////////

수정 날짜 : 12/07

동영상을 실행하고, 동영상 내부에서 오토바이를 인식하도록 만들었습니다.

다만, 성능의 문제로 인하여 동영상 해상도는 낮은 것을 써야 될 수도 있습니다.

제 노트북 기준으로 HD 영상은 힘들더군요.



cascade 에 관해서인데, 인식률과 오인식률이 비례하는 듯한 느낌입니다.

높은 인식률은 그 만큼 높은 오인식률을 보여주더군요.

어떤걸 하는게 맞을까 고민하다가, 높은 인식률을 선택했습니다.

확실한것은 cascade의 학습량에 따라서 좀 더 개선될 여지는 충분합니다만,

일단 목표한 것은 달성했다고 볼 수 있겠습니다.



사실 이 이미지는, 당연히 인식이 되지 않을 것으로 예측하고 받은 이미지인데,

인식을 해 버리더군요.





최종본 다운로드 :
https://drive.google.com/file/d/0B3mC_hyBIvc8SXZmUzB6MUpWVms/view?usp=sharing






/////////////////////////////////////////////////////////////////////////////////////////////

수정 날짜 : 12/02

OpenCV 를 활용하여 제작하고 있습니다.




원본 입력시





아래와 같이 찾습니다.





현재 일부 샘플에 대해서는 원하는 결과를 바로 찾아주는 수준까지는 왔지만,

컴퓨터 사양의 문제상, 많은 샘플을 학습시킬 수가 없으며,

적은 샘플로는 여전히 오인식하는 경우가 많습니다.


버전1 다운로드 :
https://drive.google.com/file/d/0B3mC_hyBIvc8N3dpOG5PdW9jbTA/view?usp=sharing

이미지 처리만 가능합니다.

개학과 동시에 졸업작품을 제작하는 프로젝트가 시작은 되었지만,

실제로는 약 2주간은 제안서 작성으로 소모되는게 현실이고,

남은 2주간은 다시 부품 구매 제안서 및 허가가 나기를 기다립니다.




그리고 4월 3일 이후로 구매가 가능하며,  그 말은 실제 부품 수령등은 4월 둘째주에나 가능하게 됩니다만,

일단은 프로젝트가 마인드스톰 위에 라즈베리파이를 올리고 카메라와 연동하여 작동되는 무인자동차이니 만큼, 친구에게서 미리 라즈베리를 빌렸으며, 일단은 선행작업으로 OpenCV 공부 및 개발을 미리 진행하고 있습니다.




2015/03/20 작업내용




OpenCV 예제 2개를 엮어서, 간단한 속도안내판 인식을 테스트 해봤습니다.


문제점 : 템플릿을 이용한 방식 [ Template Matching ] 인데, 위에서 이용한 템플릿의 경우, 속도안내판 30과 40의 차이가 적은 관계로 둘다 동일하게 인식합니다.
즉, 차이를 더 주던가 아니면 템플릿 비교를 다른 인식 알고리즘으로 교체 혹은 다른 방법으로 개발해야 될 필요성이 있습니다.
또한 카메라와 일정거리에서만 제대로 작동하며, 아직 앞뒤로 움직일 경우의 인식에 대해서는 보장하지 못합니다.
템플릿 이미지 사이즈 조절등이 필요합니다.



노트북 웹캠 + VS2013 을 이용한 작업이였는데, 웹캠에서 실시간 영상을 받아와서 그 인식을 해봤다는데서 의의가 있습니다.
학교 영상처리 수업에서는 bmp파일만 다뤄봤었는데, OpenCV 를 활용하니 사실상 API 호출 수준으로 매우 쉽게 영상에서 프레임 단위로 뽑아와서 처리가 가능했습니다.




2015/03/25 작업내용




현재까지 구현한 템플릿 매칭 알고리즘으로서는 위의 속도제한 표지판 30과 40을 구별해내지 못합니다.

그리하여 다른 알고리즘 확인을 테스트 해 볼겸 SURF 라는 알고리즘으로 구현된 예제를 발견, 적용해봤습니다.

일단 기존 템플릿이 30과 40을 전혀 구별하지 못했다면, SURF의 경우는 구별을 하는 경향이 있으나, 역시 완벽하지는 않았으며, 무엇보다 사각형을 제대로 그려주지 못하는 문제점이 있습니다.

제일 큰 문제점이라면 역시 속도 문제 입니다.




2015/03/27 작업내용




위 이미지를 참고하여 아래와 같이

실제 전시장에서 사용할 표지판을 포토샵을 이용하여 미리 제작하였습니다.

아무래도 영상처리 자체가 표지판을 기준으로 작업을 할 수 밖에 없는지라,

표지판 제작을 선행하는 것도 나쁘지 않다고 판단했습니다.





대략적으로 컬러로 규제표지와 지시표지를 식별한 뒤..

이리저리 해봐야 되지 않나 싶긴 하네요.





2015/03/31 작업내용




[ 각각의 인식 출력물을 GIF 로 만든 화면입니다. ]



템플릿 하나로 다양한 사이즈에서 인식하게 하는 것은 성공한 것 처럼 보입니다.

다만, 아직까지는 완벽한 조건하에서만 저렇게 작동하고 있습니다.

동작원리는 기존의 템플릿 매칭이 계속되고 있는 가운데,

기존 소스코드가 단순히 가능성이 높은 곳에서 사각형을 계속 그려주고 있었다면,

템플릿 매칭 이후에 그 영상을 그대로 갖고 와서

R,G,B 를 분리 후, R을 분리하여 빨간색 부분만 남긴 시점에서 이진화 했습니다.

그 이후 변형된 컨투어 트래킹을 이용하여 추출된 영상의 크기 값을 측정 후

여기서 사각 박스를 그려주고 있습니다.





하지만 같은 소스 코드를 이용하여 실제로 테스트 해보면



기대한 것 만큼 깔끔하게 나오고 있지는 않은 것을 확인 할 수 있습니다.




해당 영상의 이진 영상을 살펴보니..

뭔가 이상합니다 ㅠㅠ..

R값만 추출한거 같은데 제대로 동작을 안하는 거 같습니다만,

여튼..  변형된 컨투어 트래킹 원리상 잡음이 들어가면 잡음까지도 하나로 인식해버리는 문제점이 있습니다.

아마 옵션값의 문제인 듯 한데,

좀 더 연구해볼 필요성이 느껴집니다.




기존의 방식으로 같은 영상을 인식시켰을 경우 다음과 같습니다.





사각 박스를 그려주는게 템플릿의 이미지 크기 그대로 그려주는 코드기 때문에

거리가 달라질때 이미지 변화를 제대로 포착못하는 것 처럼 보여주는 문제점이 있습니다.








2015년 4월 3일 작업내용

...........

처음부터 접근을 잘못하고 있었습니다.

정확하게 생각을 잘못하고 있었습니다.

R,G,B 로 접근했었는데 [빨간색만 뽑아내면 되겠지~?]

그림자와 노이즈 처리에 상당한 애로사항이 있던 도중




영상처리 수업 시간에 만들었던 예제 프로그램을 이용하여

복습겸 하나씩 눌러봤습니다.

그리곤 깨달았습니다.

YUV로 하면 한방에 되겠구나.





그렇게 방향을 전환하자마자 이렇게 원하던 결과를 얻었습니다.

물론 다른 상황에서는 어떻게 될지 모르겠지만,

일단 현재 목표한 환경에서만큼은 기대했던 그대로 작동하는 것을 확인 할 수 있습니다.



Y가 흑백, 즉 밝기값만 갖고 있고,

U가 파란색 계통

V가 빨간색 계통으로 구성되어 있으니,

V값을 이용하여 추적했습니다.






2015년 4월 4일 작업내용





어제 성공한 표지판 추적을 바탕으로

오늘은 추적한 지점만 뽑아내는 ROI를 구현했습니다.




2015년 4월 5일 작업내용


인식용 표지판 획득.






2015년 4월 8일 작업내용



ROI 로 추출한 영상에서 다시 필요한 문자만 획득 시도해봤습니다.

문자 인식 영역을 파란 박스로 그려주고 있습니다.

현재로서는 노이즈에 약한 모습을 보여주고 있습니다.






2015 년 4월 12일 작업내용



이전 문자 인식 대비 노이즈는 어느정도 잡았습니다만,

여전히 특정 각도 이상에서는 메롱되는것은

현재 실력으로서는 어떻게 할 방법을 모르겠습니다.

당장은 시간 투자 대비 효과가 낮다고 판단하여 다음 단계로 넘어갈 예정입니다.







앞 문자만 추출하는 것을 시도해봤습니다.

레이블링 된 것을 바탕으로 앞에것만 추출을 시도했는데,

이유는 모르겠지만, 때때로 레이블링이 바뀌는거 같습니다.

음..

아마 위에서 노이즈를 제거하기 위해 2개의 큰 레이블링 값만 남기는 방식으로 이용한 것 때문에 생기는게 아닌가 싶은데, 해결방법은 모르겠습니다만,

어차피 모멘트를 하던 뭘 하던간에 결과엔 큰 영향을 주지 않을것이라 보고 있습니다.






2015년 5월 1일 작업내용



모멘트 값을 이용하여, 추출한 앞 문자들의 모멘트 값에 따라

속도 표지판을 구별하는 영상입니다.



아직 방향표지판을 구별하는 기능을 추가하지 못했기에,

방향 표지판만 나오는 영상에서는 오류가 뿜어져 나오는 것을 볼 수 있습니다만..

아마도 구현과 동시에 사라지지 않을까 기대해봅니다.





2015년 5월 8일 작업내용



속도표지판과 도로표지판 인식을 시도하여 성공했습니다.

일차적으로 졸업작품의 프리뷰버전이 완성되었다고 볼 수 있겠습니다.

라즈베리파이가 비록 최신형이긴 하지만,

영상처리를 얼마나 해줄 수 있는지에 관해서

전혀 알고 있지 않기에, [라즈베리를 이용하여 가능하다는 수준만 알고 있었습니다]

최대한 간단하게 색상인식 기반을 바탕으로 약간의 꼼수를 이용하였습니다.

특징점 이용한 방법은 유감스럽게도 라즈베리에서 충분한 속도를 뽑아줄지 의심스럽습니다.



이제 앞으로 라즈베리파이에 옮긴 뒤,

지속된 테스트와 더불어 조정에 들어가면 될 듯 합니다.



물론 라즈베리에서 충분히 버텨준다면,

인식하는 방법을 조금 더 고급스럽게 올려보고 싶네요.





2015년 5월 19일 작업내용



라즈베리파이에 코드를 옮기고 실행해본 화면입니다.

카메라 실행이 안되서 식겁했었는데,

여전히 카메라 실행이 되었다 안되었다를 반복하고 있습니다.



또한 예상보다 표지판 인식률이 낮은데, 이는 카메라가 바뀌면서 그런건지는 몰라도

값 자체를 다시 조절해야 될 필요성도 느껴집니다.

XRDP 문제인지는 몰라도, 실행 속도 또한 상당히 낮네요.






2015년 5월 20일 작업내용



나름 최적화라고 시도해봤지만

실행속도에는 전혀 체감 상승이 없습니다.

또한 어제 문제는 오늘도 여전합니다.



실행이 항상 된다는 보장이 없는게 가장 큰 문제네요.






2015년 5월 24일 작업내용



프리뷰 버전2에 해당하는 영상입니다.

실제 주행 인식 영상은 아니고..

마인드스톰 위에 휴대폰 올려서 촬영한 영상을 받아서

PC로 영상인식을 테스트 한 영상입니다.



마인드스톰은 조원들이 학교에서 작업하고,

영상처리는 제가 집에서 작업하는 형태인지라..

무엇보다 라즈베리파이를 현재 제가 갖고 있습니다 ㅋ..

그런고로 작업 자체는 따로따로 진행중에 있습니다.




결과를 평가하자면,

일단은 중간중간에 나타나면 안되는데 나타나 버리는 엉뚱한 인식들이 문제네요.

더 문제는 라즈베리파이에서도 제 속도가 안나온다는 거..

콘솔 화면창에 오류들이 뿜어나오는 것을 도무지 해결할 능력이 없기에,

아예 화면 위에다가 방향 인식했다고 출력을 시키기로 결정하여,

그렇게 출력시키고 있습니다.




개인적으로는 차라리 이 편이 훨씬 보기도 좋고 나은 듯 합니다.





기존 문제가, 출력해야 되는 시간안에 assertion error 등이 떠버리면

출력이 안되고

에러가 끝나고 난뒤에 다시 출력이 되서

중간 중간 끊기기에

아예 그러면 에러가 뜨기전에 출력자체를 끝내버리면 어떨까 싶어서

3초간 출력에서 1초간 출력으로 바꿔봤습니다 =ㅅ=




발표 시연용으론 충분할듯 합니다.

발표는 실제 보여주는게 아닌, 시간 관계상 보통 동영상으로 보여주는 경우가 많다기에..






2015 년 5월 29일 작업내용



영상에 좌우 출력하는거 자체가

콘솔화면에 뜨는 무수한 에러를 잡지 못해서였는데,

오늘 드디어




요 2가지 에러에 한해서 잡았습니다!!



덕분에 콘솔 화면은 안정적으로 출력되고 있습니다만,

저 동영상이외의 환경에서는 여전히 불안합니다.





2015년 6월 8일 - 프로젝트 종료 및 발표



OpenCV 를 사용하였으며, 라즈베리파이2와 마인드스톰을 이용한 무인자율주행 자동차 개발을 목표로 하였습니다.

다만 라즈베리파이에서 카메라가 불안정한데다 (몇번이나 교환을 받았음에도 불구하고)

라즈베리 이용시에는, PC와 달리 오류발생시 대처가 어렵다는 문제가 있어서,

일종의 네트워크 카메라를 이용한 방식으로 선회하였습니다.

폰카를 마인드스톰 앞에 거치시킨 뒤, 폰카의 영상을 네트워크를 통해 PC로 연결,

PC에서 영상처리 후 마인드스톰에 값을 보내는 방식이죠.

다만 네트워크 상태에 따라 마인드스톰으로 값이 제대로 넘어가지 않는 점이 있었으며,

영상인식쪽은 색상인식 기반인지라 그림자등의 잡음에 민감한 편이였습니다.

다만 그래도, 예상보다는 잘 인식되더군요.




위 영상은 조원이 촬영 및 제작하였습니다.








원 블로그 주소 : http://www.nipa0711.net/2015/03/OpenCV-Graduation-project-autonomous-car.html


위 블로그에 있던 내용을, 티스토리로 옮겼습니다.


  1. Ccomment 2017.02.19 19:02 신고

    안녕하세요.. 저도 현재 자율주행 자동차 프로젝트를 진행하고 있는 학생입니다.
    저의 경우 표지판 인식 기능을 맡아 구현중인데 혹시
    표지판 내에 숫자(문자인식)은 어떠한 기술을 사용하였는지 알수 있을까요..?
    책의 뒤져보며 특징점 검출 , OCR등 여러가지를 테스트 해봤는데 잘 안되서요..
    답변 주시면 감사하겠습니다..

    • 니파 nipa0711 2017.02.19 22:03 신고

      OCR이 안될리가 없을텐데요;;

      저 같은 경우는 결국 휴 모멘트로 처리했습니다.

    • Ccomment 2017.02.20 21:23 신고

      답변 감사합니다.. 한가지 더 여쭤볼께 있는데 표지판을 현재 연두색 사각형으로 잡고 있는데 저 같은 경우는 원검출 이후 yuv를 이용해서 표지판을 잡다보니 원이 표지판 내에 큰원과 작은원을 동시에 잡아서 문제가 생기더라구요.. 혹시 원검출을 이용하셨나요?? 아니면 템플릿 매칭으로만 표지판 외곽을 잡는게 가능한지 궁금합니다..
      답변 주시면 감사하겠습니다.

    • 니파 nipa0711 2017.02.21 15:12 신고

      원검출 같은 것은 따로 쓴 기억은 없습니다. 표지판 외곽은 결국 표지판을 ROI로 설정하는 것과 동일하다고 봅니다.
      제가 졸작 당시에는 흰색바탕을 배경으로 하였기에 편하게 할 수 있었습니다만..
      실제 영상이라면 단순히 이런 색상만으로 하는 것은 상당히 무리에 가까운 방식일꺼에요.

    • Ccomment 2017.02.22 16:27 신고

      답변 감사합니다. 저의 경우 숫자인식을 템플릿 매칭을 이용하여 성공하였습니다..
      그동안 답변 주셔서 감사했습니다.

  2. Univ 2020.01.10 18:09 신고

    안녕하세요. 내용 인상 깊게 잘봤습니다.
    캡스톤 수강중인 학생인데 opencv를 이용해서
    모터는 어떻게 제어를 하셨는지 알 수 있을까요?

+ Recent posts