Как получить ссылку на компоненты YUV после cvCvColor?

Я пытаюсь конвертировать BGR в YUV с cvCvtColor метод И затем получить ссылку на каждый компонент.
Исходное изображение (IplImage1) имеет следующие параметры:

  1. глубина = 8
  2. nChannels = 3
  3. colorModel = RGB
  4. channelSeq = BGR
  5. ширина = 1620
  6. высота = 1220

Конвертировать и получить компоненты после преобразования:

IplImage* yuvImage = cvCreateImage(cvSize(1620, 1220), 8, 3);
cvCvtColor(IplImage1, yuvImage, CV_BGR2YCrCb);
yPtr = yuvImage->imageData;
uPtr = yPtr + height*width;
vPtr = uPtr + height*width/4;

У меня есть метод, который преобразует YUV обратно в RGB и сохраняет в файл. Когда я создаю компоненты YUV вручную (я создаю синее изображение), это работает, и когда я открываю изображение, оно действительно синее. Но когда я создаю компоненты YUV, используя метод выше, я получаю черное изображение. Я думаю, что, возможно, я неправильно получаю ссылку на компоненты YUV

yPtr = yuvImage->imageData;
uPtr = yPtr + height*width;
vPtr = uPtr + height*width/4;

В чем может быть проблема?

0

Решение

Если вы действительно должны использовать IplImage (например, в устаревшем коде или C), тогда используйте cvSplit

IplImage* IplImage1 = something;
IplImage* ycrcbImage = cvCreateImage(cvSize(1620, 1220), 8, 3);
cvCvtColor(IplImage1, ycrcbImage, CV_BGR2YCrCb);

IplImage* yImage  = cvCreateImage(cvSize(1620, 1220), 8, 1);
IplImage* crImage = cvCreateImage(cvSize(1620, 1220), 8, 1);
IplImage* cbImage = cvCreateImage(cvSize(1620, 1220), 8, 1);
cvSplit(ycrcbImage, yImage, crImage , cbImage, 0);

Современный подход состоит в том, чтобы избежать устаревшего API и использовать Mats:

cv::Mat matImage1(IplImage1);
cv::Mat ycrcb_image;
cv::cvtColor(matImage1, ycrcb_image, CV_BGR2YCrCb);

// Extract the Y, Cr and Cb channels into separate Mats
std::vector<cv::Mat> planes(3);
cv::split(ycrcb_image, planes);
// Now you have the Y image in planes[0],
// the Cr image in planes[1],
// and the Cb image in planes[2]

cv::Mat Y = planes[0]; // if you want
1

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

В то время как RGB представляет цвет как красный, зеленый и синий; цветовая модель YCbCr представляет цвет как яркость и два цветоразностных сигнала. В YCbCr Y — яркость (яркость), Cb — синий минус яркость (B-Y), а Cr — красный минус яркость (R-Y).

Вот код для того же самого в случае, если вы используете OpenCV 3.0.0:

import numpy as np
import cv2

#Obtaining and displaying the image

x = 'C:/Users/524316/Desktop/car.jpg'
img = cv2.imread(x, 1)
cv2.imshow("img",img)

#converting to YCrCb color space

YCrCb = cv2.cvtColor(a, cv2.COLOR_BGR2YCrCb)
cv2.imshow("YCrCb",YCrCb)

#splitting the channels individually

Y, Cr, Cb = cv2.split(YCrCb)

cv2.imshow('Y_channel', Y)
cv2.imshow('Cr_channel', Cr)
cv2.imshow('Cb_channel', Cb)

cv2.waitKey(0)
cv2.destroyAllWindows()

Исходное изображение:

введите описание изображения здесь

YCrCb изображение:

введите описание изображения здесь

Y — канал:

Это так же, как изображение в градациях серого

введите описание изображения здесь

Cr — канал:

введите описание изображения здесь

Cb — канал:

введите описание изображения здесь

0

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