2013-06-17 2 views
3

에서 bgr을 hsv로 변환합니다. 웹캠에서 BGR의 다른 사람의 얼굴 사진을 찍고 그림을 HSV로 변환하고 나중에 피부 검색 알고리즘에서 사용할 HSV 값을 분석하려고합니다. 불행하게도, 그림은 cvtColor()를 사용하여 변환하려고 시도한 후에도 BGR에서 분석되는 것처럼 보입니다.opencv, C++

아래 코드를 사용하여 올바른 색 공간을 사용하는지 테스트합니다. 그것은 내가 BGR 이미지의 G 및 R 채널을 편집하고있어 좋아하는 것 같다, 그래서 대신에,이 내 얼굴 완전히 파란색 사진을 생산

Mat faceROI = findFace(first); //basic Mat, region of interest for face (code not included) 

Mat temp; 
faceROI.convertTo(temp, CV_8UC3); //making sure this has right no. of channels and such 

CvScalar s; 

IplImage face_ipl = temp; //new header 
IplImage* aNew = cvCreateImage(cvGetSize(&face_ipl), face_ipl.depth, 3); 

cvCvtColor(&face_ipl, aNew, CV_BGR2HSV); 

for(int x = 0; x < faceROI.cols; x++){ 
    for (int y = 0; y < faceROI.rows; y++){ 
     s = cvGet2D(aNew, x, y); 

     //vvvvvvvvvvv 
     s.val[1] = 0; //should be saturation 
     s.val[2] = 0; //should be value 
     //^^^^^^^^^^^ 

     cvSet2D(aNew, x, y, s); 
    } 
} 

Mat again(aNew); //<--- is this where something is set back to BGR? 
imshow("white", again); 

cvReleaseImage(&aNew); 

: 나는 0으로 채도 값을 설정하려고 부분을 참고 HSV 이미지의 S 및 V 채널 (나는 이미지를 게시 하겠지만 이것은 아직 첫 평판이므로 아직 충분한 평판이 없다.)

왜 이런 일이 일어나는 지 아는 사람이 있습니까? 모든 생각을 인정합니다.

+0

그럼 이미지를 HSV에서 BGR로 다시 변환 하시겠습니까? – sgarizvi

+0

그게 내 질문의 핵심이야 ... 나는 내가 BGR로 다시 전환한다고 생각하지 않지만 그 결과가 그 일이 무엇인지를 나타내는 것처럼 보인다. – Connor

+0

이미지에 어떤 색 공간이 있더라도'imshow' 함수는 이미지를 항상 간단한 RGB 또는 BGR 이미지로 해석합니다. S 및 V 채널에 '0'을 지정하면 B 채널 이미지에 B에 해당하는 H 채널 만 남아 있습니다. 그래서'imshow'의 경우'again'은 파란색 채널에서만 값을 갖는 BGR 이미지입니다. 그래서 당신은 파란 결과를보고 있습니다. – sgarizvi

답변

10

C++ Mat 스타일을 이전의 C IplImage *와 섞어 버리는 경우, 정확히 무엇이 진행되고 있는지 혼란스럽게 만듭니다.

Mat fullImageHSV; 
cvtColor(inputImage, fullImageHSV, CV_BGR2HSV); 

는 OpenCV의 HSV 값은 0-180 동안 S에서 H를하고 다른 프로그램이 다른 값을 사용하는 경향이있는 동안 V가 255에서 것을주의 : 여기에 HSV에 inputImage을 설정하는 코드입니다. 또한 OpenCV는 HSV 이미지를 정상적으로 표시 할 수 없으며 RGB로 해석되기 때문에 색상이 왜곡됩니다.

+0

Gotcha. 나는 iplImage *가 사용자 친화적 인 것처럼 느껴졌습니다 ... OpenCV의 HSV 이미지를 정상적으로 표시 할 수 없다는 점에 대해서도 감사합니다. 문제의 대부분이 어디에서 오는지 알 수 있습니다. 귀하의 답변에 감사드립니다. – Connor

+0

예, 하나를 선택하고 C 또는 C++ API를 사용하는 것이 좋습니다. 둘 다 고유 한 스타일을 가지고 있습니다. 범위 및 색상 해석 설명은 –

+0

+100입니다. 나는 그것을 위해 나의 머리를 긁적 거렸다! – inblueswithu