cv :: Scalar不显示预期的颜色

时间:2013-04-10 04:08:32

标签: c++ ios opencv colors drawellipse

在图像框架上,我使用

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)],而不是所需的绿色。

此时我错过了什么?有任何建议请。谢谢。

修改

让我把完整的相关代码放在这里。根据{{​​3}},这是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 );

}

最终,椭圆仍为白色,而不是所需的绿色椭圆。

4 个答案:

答案 0 :(得分:12)

将alpha设置为255可以解决此问题。 标量(94206165255)

答案 1 :(得分:2)

由于mrgloom在注释中正确指出,可能是因为你的图像类型[你要绘制的Mat对象,即Mat& img in ellipse()函数]。 cv :: Scalar(94,206,165)是8UC3型图像所需的绿色。在32FC3图像中设置这些值将导致白色。

答案 2 :(得分:1)

你可以使用

src.convertTo(src,CV_8UC3);

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

答案 3 :(得分: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());

你会在转换之前看到:

channels 4
depth 0
type 24
element size 4

我认为是CV_8UC4,转换后变为:

channels 3
depth 0
type 16
element size 3

是CV_8UC3。

我猜其中没有cvtColor不起作用的原因之一是当{4}中提到的目标图像是4通道时,opencv绘图函数不支持alpha透明度。因此,通过转换CV_RGBA2BGR,我们取出alpha通道。但是,如果我这样做,我说我没有成功:

cvtColor(image, image, CV_RGBA2RGB);

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