본문 바로가기
영상처리/OpenCV

Stereo Vision(스테레오 정합 또는 매칭)

by 목가 2010. 7. 26.
반응형

Stereo Vision을 공부할 때 인터넷을 많이 뒤져봤지만 제대로 된 소스를 찾기 힘들었다.

어떤 함수를 쓰면 된다고는 하지만 잘 이해도 되지 않고 정보가 많이 부족해서 고생했던 기억이 남았다.

그래서 여기에 기록해 두고 사람들에게 도움이 됐으면 한다.

CvStereoBMState *BMState = cvCreateStereoBMState();   
BMState->preFilterSize=21;  // 5x5에서 21x21까지
BMState->preFilterCap=21; //....뭔지...기억이..-0-
BMState->SADWindowSize=21;  //스테레오 공부하시는 분들이라면 다 아실거라 생각합니다.(5x5.... 21x21)
BMState->minDisparity=1;
BMState->numberOfDisparities=128;  //Searching하기 위한 pixel들의 개수
BMState->textureThreshold=10;    //minimum allowed
BMState->uniquenessRatio=5;      //...음...-.- 일단 대충 세팅.. ㄱㄱ

일단 위에 소스를 보면 CvStereoBMState라는 변수를 생성해야 합니다.
그리고 스테레오영상을 만들기 위해서는 캠 2개를 사용했거나 2장의 이미지를 이용하셨을 테니깐

Left영상과 Right영상을 가져옵니다.

IplImage * L = cvCreateImage(cvSize(Left->width,Left->height), Left->depth, 1); 
IplImage * R = cvCreateImage(cvSize(Right->width,Right->height), Right->depth, 1);  

대충 이런식으로 생성해서 영상을 불러온 후에 Gray영상으로 변환해 줘야합니다. 왜냐면?? stereo함수가 gray영상을 요구함.
(까다로운 녀석...)

cvCvtColor(Left, L, CV_RGB2GRAY);
cvCvtColor(Right, R, CV_RGB2GRAY);

그리고 두 영상을 통해서 얻는 disparity map을 넣어줄 변수가 필요하니깐 Matrix하나 만들어 줍니다.

CvMat * disparity= cvCreateMat(Left->height, Left->width, CV_16SC1);

또한, disparity영상을 뿌려줄 이미지변수도 필요하니깐 하나 만들어 줍니다.

IplImage * disparity_img = cvCreateImage(cvSize(Left->width,Left->height), IPL_DEPTH_8U, 1);

이제 함수만 돌려주면 끝납니다.

cvFindStereoCorrespondenceBM(L, R, disparity, BMState);
cvNormalize(disparity, disparity_img, 0, 255, CV_MINMAX);  //정규화해주고요~

그리고 disparity_img영상을 Show해주면 완성!!!!!!!!!!!!!!!!!!!!! 쉽죠??? ㅋㅋㅋ 이렇게 쉬운데..왜 인터넷엔 없었을까요...ㅠㅠ 

어쨋든 다들 성공하시길 바랍니다!!!! 참고로 BMState설정 값에 따라서 결과 값이 완전다르니깐!! 잘 설정해서 사용하도록하세요 ^_^


위 그림은 좌우 손의 영상과 결과 영상입니다.








반응형

'영상처리 > OpenCV' 카테고리의 다른 글

OpenCV 자주 쓰는 기능들 모음  (1) 2010.07.29

댓글