2013-04-10 31 views
7

上的图像帧,我用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)

绘制一个椭圆,我想设置的椭圆颜色为绿色enter image description here [RGB值:(165,206 ,94)]。 所以我的参数const Scalar& color设置为

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 

我也试过RGB替代。

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)〕,而不是所期望的绿色之一。

我在这里错过了什么?请提供任何建议。谢谢。

编辑:

让我把整个相关的代码在这里。根据OpenCV iOS - Video Processing,这是CvVideoCamera配置在- (void)viewDidLoad;

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;进行处理,这里是绘制椭圆的代码:

- (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 2013-04-10 05:45:38

+2

也许你有漂浮类型的图像?哪些值[0 1]的值范围? – mrgloom 2013-04-10 05:55:24

+0

@Barshan Das我已经检查并评论了代码的其余部分,但颜色仍然相同。哪一个适合你? – Protocole 2013-04-10 06:19:11

回答

2

由于mrgloom在评论中指向正确,可能是因为您的图片的类型[您要绘制的Mat对象,即在椭圆()函数]中的图像Mat &。 cv ::标量(94,206,165)是8UC3型图像所需的绿色。在32FC3图像中设置这些值将导致白色。

+0

对不起请澄清我。我有'image.type()= 24'。这是否导致白色的cv :: Scalar(94,206,165)? 如果是这样,我应该转换为什么Mat图像类型以获取正确的绿色?我可以使用'src.convertTo(dst,);'?谢谢。 – Protocole 2013-04-10 09:46:10

+0

是的,你可以通过convertTo函数来转换src。显示你如何构建src矩阵的代码。 – Barshan 2013-04-10 10:27:30

+0

我试图转换图像类型没有运气。请参阅本版中的相关代码。再次感谢。 – Protocole 2013-04-11 02:25:55

1

可以使用

src.convertTo(SRC,CV_8UC3);

其中CV_8UC3表示您使用8位无符号字符和3色图像表示。 更多信息,你可以在这里找到OpenCV docs 之后,你的椭圆应该是绿色的,如果它不帮助发布整个代码。

+0

试过你的答案没有成功。请在版本中查看完整的相关代码。谢谢。 – Protocole 2013-04-11 02:27:25

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); 

如果您还登录通道,深度和在上述类型信息功能如下:

​​

你会转换前看到:

channels 4 
depth 0 
type 24 
element size 4 

我认为这是CV_8UC4和转换后变成:

channels 3 
depth 0 
type 16 
element size 3 

这是CV_8UC3。

我猜为什么它没有cvtColor不工作的原因之一是,当目标图像是4通道时,opencv绘图函数不支持alpha透明度,如opencv documentation中所述。所以通过转换CV_RGBA2BGR我们可以取出alpha通道。不过话说回来,我不设法得到,如果我做的工作:

cvtColor(image, image, CV_RGBA2RGB); 

在这个红色和蓝色颜色的图像中反转。所以虽然它似乎有效,但我不确定这是否是真正的原因。

9

将alpha设置为255可以解决此问题。 标量(94,206,165,255)

+0

请解释。 – Irfan 2014-03-19 05:58:42

+1

我不知道如何,但这对我有效。 – bakalolo 2016-12-02 04:47:46