티스토리 뷰

OpenCV

[Kinect with OpenCV] CannyEdge with Kinect SDK

생각많은 소심남 2012. 10. 13. 23:35

계속해서 키넥트와 OpenCV를 결합한 프로젝트에 대해서 소개해드리고 있습니다. 

일전에 C로 구현하는 ColorStream 출력에 대한 내용도 했었습니다. 

2012/08/06 - [About OpenCV] - [Kinect with OpenCV] C++로 만들어보는 이미지 호출

그리고 Canny Edge에 대해서 여러가지 테스트 해본 것도 한번 다뤄봤습니다. 

2012/08/14 - [About OpenCV] - [OpenCV] Threshold 값의 변화에 따른 edge extraction


하지만 그때는 정지된 이미지에서 CannyEdge를 구현했었기 때문에 이게 실제 동영상에서도 활용할 수 있을까에 대한 의문이 생길 수 있습니다.

사실 다들 알다시피 동영상이라는 것은 Frame이 누적되어가면서 생기는 이미지들의 집합이기 때문에 각 Frame별로 edge를 판단해주면 우리 눈으로는 그게 영상자체가 edge가 된 것처럼 보이게 되는거죠. 그래서 그걸 보여드리고자 합니다. 소스는 기존 이미지 출력 소스로 진행하겠습니다.


그런데 생각해보니까 삽입해줄 코드는 얼마 많지 않습니다. 우선 전에도 소개했는지는 모르겠지만 Canny Edge는 Gray Image에서 수행됩니다. 물론 찾다보면 Color기반의 Canny Edge 방식이 있기도 한데 그저 학문적인 연구 수준인 거 같습니다. 그래서 다루기는 조금 힘들거 같고... 우선은 봅시다.


자 그럼 일단 흑백 이미지가 필요할테니까 그에 대한 이미지 버퍼를 생산해두는 게 좋겠지요. 두개를 생성할건데 하나는 Gray로 변환한 형태, 다른 하나는 Gray에서 Edge로 변환한 형태가 될겁니다. 물론 그걸 띄울 창도 만들어 놓는게 좋겠지요.



물론 끝부분에서는 이렇게 생성한 이미지 버퍼와 창들을 다 닫아줘야 하겠지요.



참고로 지난번 Color를 해제할때 오류가 났었는데 원인이 바로 CreateRGBImage 함수에서도 자체적으로 Frame을 해제하는 함수를 사용했었습니다. 그런데 그렇게 Frame을 해제한 상태에서 또 해제하려니까 오류가 발생한 것이지요. 그래서 위처럼 그에 대한 Header만 해제시키면 원할하게 동작합니다.


그다음 Gray 에다가는 Color를 gray로 변환시켜서 넣어줍니다. 이전에 createRGBImage에서 output이 Color 이미지였으니까 그 코드 바로 밑에 다음과 같이 삽입해주면 되겠지요.



일단 이상태에서 실행시켜보면 다음과 같이 나옵니다.



1차적으로 Gray 이미지를 봅아내는데 성공했습니다. 당연히 Canny창에는 아무것도 안넣었으니까 위와 같이 회색창이 그대로 뜹니다. 이제 만들어낸 Gary 이미지를 바탕으로 Canny를 만들기 위해서는 다음과 같이 코드를 추가해주면 되겠지요.



결과는 다음과 같이 나옵니다.



실제로 해보시면 잡음같은게 많이 낄겁니다. 이때는 Canny 처리를 하면서 들어가는 Threshold 값을 적절하게 조절하지 못했기 때문입니다. 이를 사용자가 직접 수정하기 위해서는 TrackBar같은걸 하나 삽입하는게 좋겠지요, 그냥 한번 Test로 Low Threshold와 High Thre 값을 바꿔주는 TrackBar를 하나 삽입해봤습니다.



여러분이라면 더 멋지게 만드실겁니다 :)

댓글