게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
OpenCV 패치 기반 역투영 함수 질문드립니다..
게시물ID : programmer_13996짧은주소 복사하기
작성자 : 후!하!후하
추천 : 0
조회수 : 1681회
댓글수 : 5개
등록시간 : 2015/10/20 23:16:17
옵션
  • 본인삭제금지
/*
연습문제 2번과 같이 손의 피부색 RGB 히스토그램을 만들어라. 실내 손 영상으로 부터 히스토그램을 만들어
이를 모델로 삼고, 두 번째 실내 영상과 첫 번째 실외 그늘 영상, 첫 번째 실외 밝은 지역 영상과의 EMD를 계산하라.
측정된 값들을 이용하여 거리 임계값을 설정하라
b. 임의로 선택된 살이 아닌 배경 패치에 대하여 히스토그램을 구하고, EMD 거리 임계값이 제대로 동작하는지 판별하라
*/
#include <highgui.h>
#include <cv.h>
int main(int argc, char *argv[]) {
// 손에 대한 RGB
IplImage *inHandImage = cvLoadImage("indoor-hand.jpg");
IplImage *outHandImage = cvLoadImage("outdoor-hand.jpg");
int bins[] = { 128, 128, 128 };
CvHistogram *inHandHisto = NULL, *outHandHisto = NULL;
{
float rRange[] = { 0,255 }, gRange[] = { 0,255 }, bRange[] = { 0,255 };
float *ranges[] = { rRange, gRange, bRange };
inHandHisto = cvCreateHist(
3, bins, CV_HIST_ARRAY, ranges);
outHandHisto = cvCreateHist(
3, bins, CV_HIST_ARRAY, ranges);
}
IplImage *inHand_splited[3] = { NULL, };
IplImage *outHand_splited[3] = { NULL, };
for (int i = 0, len = sizeof(inHand_splited) / sizeof(inHand_splited[0]); i < len; i++) {
inHand_splited[i] = cvCreateImage(
cvGetSize(inHandImage), IPL_DEPTH_8U, 1);
outHand_splited[i] = cvCreateImage(
cvGetSize(outHandImage), IPL_DEPTH_8U, 1);
}
cvSplit(inHandImage, inHand_splited[0], inHand_splited[1], inHand_splited[2], NULL);
cvSplit(outHandImage, outHand_splited[0], outHand_splited[1], outHand_splited[2], NULL);
cvCalcHist(inHand_splited, inHandHisto);
cvCalcHist(outHand_splited, outHandHisto);
cvThreshHist(inHandHisto, 1500);
cvThreshHist(outHandHisto, 20);
CvSize patchSize = cvSize(10, 10);
IplImage *inhandResult = cvCreateImage(
cvSize(inHandImage->width - patchSize.width + 1, inHandImage->height - patchSize.height + 1), IPL_DEPTH_32F, 1);
IplImage *outhandResult = cvCreateImage(
cvSize(outHandImage->width - patchSize.width + 1, outHandImage->height - patchSize.height + 1), IPL_DEPTH_32F, 1);
CvMat *inhandResult2 = cvCreateMat(outHandImage->height - patchSize.height + 1, outHandImage->width - patchSize.width + 1, CV_32FC1);
cvCalcBackProjectPatch(outHand_splited, outhandResult, patchSize, inHandHisto, CV_COMP_CORREL, 1);
cvNamedWindow("R1", 1);
cvNamedWindow("R2", 1);
cvShowImage("R1", outhandResult);
cvShowImage("R2", inhandResult);
cvWaitKey(0);
}

원래 이렇게 질문은 잘 안드리는데..ㅜㅜ 어디다가 물어볼 곳이 없어 질문드립니다.

위에 cvCalcBackProjectPatch( ~ )를 실행하게 되면 아무리 기다려도 함수가 끝나지를 않습니다.

내부적으로 수행이 어떻게 되는지를 모르니 왜 안끝나는지 알 방법이 없기도 하구요..

위 코드는 위 주석의 문제처럼

손 색상에 대한 RGB를 히스토그램으로 만들어 실외에서 촬영한 손에 패치기반 백투영 하는 소스입니다.

혹시 제가 백투영을 하기 전에 잘못된 부분이 있나 싶어서 질문드렸습니다..

아까부터 계속 씨름해서 머리에 당이 떨어졌는지 집중이 안되서 .. 질문드립니다 ㅜㅜ

런타임이나 컴파일 상 오류는 없는 상태입니다.
(메모리 할당을 해제해 주는 코드는 귀찮아서 적지 않았습니다.. 하도 치다보니까 한줄 한줄 귀찮더라구요)

원래 저 함수의 속도가 이렇게 느린지..

부탁드립니다 ㅜㅜ

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호