2013-04-10 2 views
7

표시하지 I 타원을 그리 CV : 스칼라 이미지 프레임 예상 색

void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

를 사용하여 I 녹색 enter image description here [RGB 값 타원 색상 설정하고자하는 (165, 206 , 94)]. 그래서 나는 또한 RGB 대안을 시도

cv::Scalar(94.0, 206.0, 165.0, 0.0); // as BGR order, suppose the value is 0.0 - 255.0 
cv::Scalar(94.0/255.0, 206.0/255.0, 165.0/255.0, 0.0); // suppose the value is 0.0 - 1.0 

에 매개 변수 const Scalar& color을 설정합니다.

CV_RGB(165.0, 206.0, 94.0); // as RGB order, suppose the value is 0.0 - 255.0 
CV_RGB(165.0/255.0, 206.0/255.0, 94.0/255.0); // suppose the value is 0.0 - 1.0 

하지만 표시되는 색이 흰색 enter image description here이다 RGB 값이 (255, 255, 255)]이 아니라 목적 한 녹색.

내가 지금까지 놓친 것은 무엇입니까? 어떤 제안 바랍니다. 고맙습니다.

편집 :

나를 여기에 모든 관련 코드를 넣어 보자.

self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imgView]; 
[self.videoCamera setDelegate:self]; 
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront; 
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288; 
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; 
self.videoCamera.defaultFPS = 30; 
self.videoCamera.grayscaleMode = NO; 
[self.videoCamera adjustLayoutToInterfaceOrientation:UIInterfaceOrientationPortrait]; 

그렇다면 호출 [self.videoCamera start];(Mat&)image 캡처 될 상기 CvVideoCameraDelegate 방법 - (void)processImage:(Mat&)image;에서 처리 될 수 있으며, 여기서 타원 그리는 코드이다 :

OpenCV iOS - Video Processing에 따르면,이 - (void)viewDidLoad;에서 CvVideoCamera 구성은
- (void)processImage:(Mat&)image { 

NSLog(@"image.type(): %d", image.type()); // got 24 

// image.convertTo(image, CV_8UC3); // try to convert image type, but with or without this line result the same 

NSLog(@"image.type(): %d", image.type()); // also 24 

cv::Scalar colorScalar = cv::Scalar(94, 206, 165); 
cv::Point center(image.size().width*0.5, image.size().height*0.5); 
cv::Size size(100, 100); 
cv::ellipse(image, center, size, 0, 0, 360, colorScalar, 4, 8, 0); 

}

는 결국, 타원 흰색이 아닌 원하는 녹색 하나에 아직도있다.

+0

코드의 나머지 부분을 확인하고 다른 곳에서 색상 값을 변경하지 않았는지 확인하십시오. 당신이 제공 한 부분은 내 컴퓨터에서 예상되는 녹색 색상을 완벽하게 보여줍니다. – Barshan

+2

어쩌면 플로트 타입의 이미지가 있을까요? [0 1] 값의 범위는 무엇입니까? – mrgloom

+0

@ Barshan Das 코드의 나머지 부분을 확인하고 주석을 달았지만 색상은 여전히 ​​동일합니다. 어느 것이 당신을 위해 일하는가? – Protocole

답변

2

mrgloom이 주석에서 올바르게 가리키기 때문에 이미지의 유형 [ellipse() 함수에서 Mat & img]와 같은 그리기를 원하는 Mat 객체가 원인 일 수 있습니다. cv :: Scalar (94, 206, 165)는 8UC3 유형 이미지에 대해 원하는 녹색입니다. 32FC3 이미지에서이 값을 설정하면 흰색이됩니다.

+0

죄송합니다. 나를 명확히하십시오. 나는'image.type() = 24'을 얻었다. 이 결과로'cv :: Scalar (94, 206, 165)'가 흰색으로 나타 납니까? 그렇다면 정확한 녹색을 얻기 위해 변환해야하는 매트 이미지 유형은 무엇입니까? 그냥'src.convertTo (dst, ); '을 사용할 수 있습니까? 고맙습니다. – Protocole

+0

예 src를 convertTo 함수로 변환 할 수 있습니다. src 행렬을 작성하는 방법에 대한 코드를 표시하십시오. – Barshan

+0

행운을 빌어 이미지 유형을 변환하려고했습니다. 에디션의 관련 코드를 참조하십시오. 다시 한번 감사드립니다. – Protocole

1

당신은

src.convertTo (SRC, CV_8UC3)를 사용할 수 있습니다;

여기서 CV_8UC3은 8 비트 부호없는 char 및 3 색 이미지 표현을 사용함을 의미합니다. 여기에서 찾을 수있는 더 많은 정보 OpenCV docs 전체 코드를 게시하는 데 도움이되지 않으면 타원이 녹색이어야합니다.

+0

성공하지 못한 채로 귀하의 답변을 시도했습니다. 에디션의 관련 코드 전체를 참조하십시오. 고맙습니다. – Protocole

0

나는 비슷한 문제를 겪고 있었고 처음에는 이미지를 BGR로 변환하여 문제를 해결했습니다.따라서 귀하의 경우 processImage 기능은 같을 것이다 :

-(void)processImage:(Mat&)image 
{ 
    cvtColor(image, image, CV_RGBA2BGR); 
    cv::Scalar colorScalar = cv::Scalar(94, 206, 165); 
    cv::Point center(image.size().width*0.5, image.size().height*0.5); 
    cv::Size size(100, 100); 
    cv::ellipse(image, center, size, 0, 0, 360, colorScalar, 4, 8, 0); 
} 

난 당신의 코드에 포함되어있는 유일한 라인은 다음과 같습니다

cvtColor(image, image, CV_RGBA2BGR); 

당신은 또한 채널, 깊이를 기록하고 위의 정보를 입력하면 기능은 다음과 같이

: 당신이 변환하기 전에 볼 수
NSLog(@"Before conversion"); 
NSLog(@"channels %d", image.channels()); 
NSLog(@"depth %d", image.depth()); 
NSLog(@"type %d", image.type()); 
NSLog(@"element size %lu", image.elemSize()); 
cvtColor(image, image, CV_RGBA2BGR); 
NSLog(@"After conversion"); 
NSLog(@"channels %d", image.channels()); 
NSLog(@"depth %d", image.depth()); 
NSLog(@"type %d", image.type()); 
NSLog(@"element size %lu", image.elemSize()); 

내가 생각하는

는 CV_8UC4이며 변환 후가된다 : CV_8UC3는

channels 3 
depth 0 
type 16 
element size 3 

이다.

내가 cvtColor없이 작동하지 않는 이유 중 하나는 opencv documentation에서 언급 한 것처럼 대상 이미지가 4 채널 인 경우 opencv 그리기 기능이 알파 투명도를 지원하지 않는다는 것입니다. CV_RGBA2BGR을 변환하여 알파 채널을 제거합니다. 그러나 내가 할 경우 나는 그것을 얻을 수있는 관리하지 못했다고 :

cvtColor(image, image, CV_RGBA2RGB); 

이 빨간색과 파란색의 색상이 반전되어 있습니다. 그래서 그것이 작동하는 것처럼 보이지만 그것이 실제 이유인지 나는 확신하지 못한다.

9

알파를 255로 설정하면이 문제를 해결할 수 있습니다. 스칼라 (94,206,165,255)

+0

설명 해주십시오. – Irfan

+1

나는 이것이 어떻게 작용했는지는 모르지만 이것이 나를 위해 일했습니다. – bakalolo