cv :: Scalar не отображает ожидаемый цвет

На рамке изображения я использую

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 — обработка видео, это 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 );

}

В конце концов, эллипс все еще белый, а не желаемый зеленый.

7

Решение

Установите альфа на 255 может решить эту проблему.
Скалярное (94206165255)

11

Другие решения

Как правильно указывает mrgloom в комментарии, это может быть связано с типом вашего изображения [объект Mat, где вы хотите нарисовать, т.е. Mat &img в функции ellipse ().
cv :: Scalar (94, 206, 165) — желаемый зеленый цвет для изображений типа 8UC3. Установка этих значений в изображении 32FC3 приведет к белому цвету.

2

ты можешь использовать

src.convertTo (src, CV_8UC3);

Где CV_8UC3 означает, что вы используете 8-битный символ без знака и 3-цветное представление изображения.
Более подробную информацию вы можете найти здесь OpenCV документы
после этого ваш эллипс должен быть зеленым, если это не поможет опубликовать весь код.

1

У меня была похожая проблема, и мне удалось исправить ее, сначала преобразовав изображение в 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, заключается в том, что функции рисования opencv не поддерживают альфа-прозрачность, когда целевое изображение является 4-канальным, как упомянуто в документация opencv. Таким образом, конвертируя CV_RGBA2BGR, мы убираем альфа-канал. Однако, сказав, что мне не удалось заставить это работать, если я делаю:

cvtColor(image, image, CV_RGBA2RGB);

При этом красный и синий цвета инвертированы на изображении. Так что, похоже, это работает, но я не уверен, является ли это реальной причиной.

0
По вопросам рекламы [email protected]