【问题标题】:cv::Scalar not displaying expected colorcv::Scalar 不显示预期的颜色
【发布时间】:2013-04-01 18:10:38
【问题描述】:

在图像框架上,我使用

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)

要绘制一个椭圆,我想将椭圆颜色设置为绿色 [ 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

但显示的颜色是白色 [RGB 值 (255, 255, 255) ],而不是所需的绿色。

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

编辑:

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

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 1] 值范围?
  • @Barshan Das 我已经检查并注释了其余代码,但颜色仍然相同。哪一个适合你?
  • @mrgloom 你所说的“图像”是什么意思?是图像作为方法ellipse()中的参数吗?如果是,是Mat& image,我怎么知道它的类型是不是float?
  • 你可以使用 mat.type()

标签: c++ ios opencv colors drawellipse


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对不起,请澄清一下。我有image.type() = 24。这会导致cv::Scalar(94, 206, 165) 为白色吗?如果是这样,我应该转换为什么 Mat 图像类型以获得正确的绿色?我可以使用src.convertTo(dst, <suitable_image_type>); 吗?谢谢。
    • 是的,您可以通过 convertTo 函数转换 src。显示如何构建 src 矩阵的代码。
    • 我尝试转换图像类型,但没有成功。请查看版本中的相关代码。再次感谢。
    【解决方案3】:

    我遇到了类似的问题,我已经设法通过首先将图像转换为 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 通道时,opencv 绘图函数不支持 alpha 透明度,如opencv documentation 中所述。所以通过转换 CV_RGBA2BGR 我们取出 alpha 通道。不过话虽如此,如果我这样做了,我就无法让它发挥作用:

    cvtColor(image, image, CV_RGBA2RGB);
    

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

    【讨论】:

      【解决方案4】:

      你可以使用

      src.convertTo(src, CV_8UC3);

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

      【讨论】:

      • 试过你的答案没有成功。请查看版本中的完整相关代码。谢谢。
      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多