2014년 9월 18일 목요일

Kinect for Windows v2 AudioCaptureRaw-Console Example에서 Buffer Duration을 늘리는 문제

AudioCaptureRaw-Console 예제를 수정하여
실시간으로 소리를 모니터링 할 수 있도록 WASAPI의 render 기능을 추가하였다.
default buffer duration 은 20ms 이고, 20ms 에서는 소리가 잘 나온다.

하지만
잘 재생하다가 가끔식 처리 속도가 20ms보다 달리는지 처리를 못해서 빈 음이 재생되는 경우가 있다.

그래서 buffer duration을 늘리면 처리 속도에 대한 문제를 해결할 수 있을 거라 생각했고, 40, 100ms 등 여러 duration으로 늘려보았다.

하지만
자꾸 음이 끊기는 소리가 들리고, duration이 길어질 수록 그 현상은 심해져 갔다.

코드를 분석하여 이유를 찾아보았다.

이유는 capture client가 허용하는 number of available frames 가 자꾸 160으로 나온다는 것이다.

20ms 일 때 입력, 출력 버퍼의 길이는 아래와 같다.
맨 아래쪽 출력된 것을 보면 된다.


40ms 일 때는 아래와 같았다.


number of framesAvailable이 buffer의 길이에 상관 없이 항상 160으로 맞추어져 있는 것이다! 이 문제에 대해서 MSDN forum의 답변을 기다리고 있다.

http://social.msdn.microsoft.com/Forums/en-US/ef5f15e6-061f-4911-8a37-073c3689aa47/the-k4w2-audio-enginelatency-of-microphone-array-is-constant?forum=kinectv2sdk#6517d449-dfc6-464c-b90e-6c9456b8e7fb

2014년 8월 2일 토요일

같은 Kinect Buffer 에서 여러 Mat을 받아올 때 서로 영향을 받는 현상

테스트를 해본 결과

특정 버퍼에서 여러 다른 Mat을 얻어낼 수 없다.

cv::Mat colorImage( colorHeight, colorWidth, CV_8UC4, &colorBuffer[0] )에서

호출되는 Mat 생성자를 보면

Mat(int rows, int cols, int type, const Scalar& s);

위와 같이 레퍼런스로 받는 것을 볼 수 있다.

따라서 Mat을 변형시키면 Buffer도 영향을 받는 구조인 것이다

이를 피하기 위해 copyTo를 써서 해결했지만 속도가 엄청 느리다


OpenCV Rect memory leaks

반복문 내에
std::vector<Rect> faces;
가 있을 때, 화면에 붙여주고 나서 다음 loop에서 memory leaks이 발생하곤 한다.

http://code.opencv.org/issues/1751

static std::vector<Rect> faces;// memory leaks 피해가는 꼼수...

faces.clear();// 붙여주고 나서 실행

이렇게 하면 되기는 된다.

Kinect 2 영상을 OpenCV로 변환해 stasm 4.0 minimal 예제에서 작동시켜보기

겪은 어려움 위주로 서술

한 폴더 내 헤더 파일, 소스 파일 인식 불능

프로젝트 마우스 오른쪽 클릭으로 클래스를 생성하면 헤더 파일과 cpp 파일이 프로젝트와 같은 폴더에 생기는데, 

stasm 프로젝트 설정 자체가 프로젝트와 같이 있는 소스, 헤더 파일은 읽지 않도록 되어 있는 것 같아 편법을 사용했다.

프로젝트속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리에

../vc10 을 추가. 그리고 얖에 써있는 opencv 2.4.0 어쩌구 하는 잘못된 경로 삭제.

위의 ../vc10은 그저 나갔다 들어오는 것을 나타낸다.


objdetect.hpp(338): 
error C2589: '(' : '::' 오른쪽에 잘못된 토큰이 있습니다.
error C2059: 구문 오류 : '::'


objdetect.hpp의 전처리 부분에

#ifdef max
#undef max
#undef min
#endif

삽입으로 해결.

Release 속성도 같은 방법으로 해준다.

GrayImage에 대해서 작동하는 Stasm 알고리즘

cv::Mat_<unsigned char> grayImage;

cvtColor(colorImage, grayImage, CV_RGB2GRAY);

이러한 구문을 통해 해결.

결과
openMP도 쓰고 Release 버전에서 돌려도 부드럽게 추적하지는 못함.
이유는 사진용 알고리즘이라 매번 Shape를 다시 던지고 1/16 크기의 화면부터 다시 검색하기 때문이라고 생각됨. Stasm 공부를 깊게 해서 내부 함수를 마음대로 수정할 수 있는 능력이 필요함.

Kinect for Windows v2 OpenCV 예제 빌드 시 주의사항

아래 블로그에 들어가서 예제를 다운 받는다.

http://www.naturalsoftware.jp/kinect-for-windows-sdk-v2-0%E5%85%A5%E9%96%80-%E7%9B%AE%E6%AC%A1

https://github.com/kaorun55/Kinect-for-Windows-SDK-v2.0-Samples

예제가 VS2013 에서 작성되었고 C++11 문법들로 작성되어 있는데다가

VS2012에서는 C++11 문법의 일부 밖에 지원하지 않아

많은 고생을 했다.

또한 Nuget Package manager로 opencv를 설치한 것으로 보여

패키지 관리자 콘솔에서

Install-Package opencv를 입력하여 형식적으로 설치해주고

따로 프로젝트 속성에서 opencv 경로를 잡아주어야 했다.


또한 Comptr.h 파일을 Include 하지 않고

스마트 포인터로 구현된 구문은 일반 포인터 구문으로 바꿔주고,

클래스 멤버 변수를 선언하면서 동시에 초기화 하는 문법은 VS2012에서 지원을 안하는 것처럼 보이므로 initialize 함수에서 NULL 값 등을 넣어주었다.

스마트포인터가 아니게 되었으므로 메모리 Release에 신경을 써야 영상이 부드럽게 출력된다. ***Frame 객체들은 버퍼에 전달 한 후 꼭 바로바로 Release해주어야 했다.


그리고 이제야 알게 된 사실인데, 마지막 예제의 실행 속도가 느렸던 것은 디버그 모드로 컴파일 했기 때문이었다...

Kinect for Windows v2 설치 및 OpenCV 예제

요구 사항


Windows 8, 8.1
USB 3.0
Visual Studio 2012 이상
DirectX 11.0 이상

2G RAM 이상

현재 C++ 에 대한 Face recognition을 지원하지 않는다. Developer Network의 글.
If you are would like to join the Kinect for Windows Developer Preview Program to access the weekly SDK updates please send us an email. The Developer Preview will allow you access to weekly updates which will include Fusion and Face HD and related samples.
Please email K4W@microsoft.com with the subject line: “DPP Invitation Request” to get your invitation.

일본 MS MVP 개발자들의 블로그. 크롬으로 들어가서 번역하면 읽고 적용하는데 문제는 없다. OpenCV 예제도 있다.

C# Face Recognition 예제. Body 인식이 먼저 된 후에 실행되는 형태로 만들어져 있다.

영어 강의 동영상