C++ CVCOLOR后如何获得YUV组件的参考?
我正在尝试使用C++ CVCOLOR后如何获得YUV组件的参考?,c++,opencv,color-scheme,C++,Opencv,Color Scheme,我正在尝试使用cvtcolor方法将BGR转换为YUV,然后获取对每个组件的引用。 源图像(IplImage1)具有以下参数: 深度=8 n通道=3 颜色模型=RGB channelSeq=BGR 宽度=1620 高度=1220 转换并获取转换后的组件: IplImage* yuvImage = cvCreateImage(cvSize(1620, 1220), 8, 3); cvCvtColor(IplImage1, yuvImage, CV_BGR2YCrCb); yPtr = yuvIma
cvtcolor
方法将BGR转换为YUV,然后获取对每个组件的引用。
源图像(IplImage1
)具有以下参数:
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;
有什么问题吗?如果您确实必须使用IplImage(例如,在遗留代码或C中),请使用 现代方法是避免传统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
cv::Mat matImage1(IplImage1);
cv::Mat ycrcb_图像;
cv::cvtColor(matImage1,ycrcb_图像,cv_BGR2YCrCb);
//将Y、Cr和Cb通道提取到单独的垫子中
std::向量平面(3);
cv::分割(ycrcb_图像,平面);
//现在在平面[0]中有了Y图像,
//平面中的Cr图像[1],
//以及平面中的Cb图像[2]
cv::Mat Y=平面[0];//如果你愿意
而RGB表示颜色为红色、绿色和蓝色;YCbCr颜色模型将颜色表示为亮度和两个色差信号。在YCbCr中,Y是亮度(luma),Cb是蓝色减去luma(B-Y),Cr是红色减去luma(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-频道:
请不要使用IplImages,避免使用过时的c-api。他们已经在2010移动到C++,你也应该这样做。请使用cv::Mat,即cv::命名空间。@berak,我会在了解问题所在后再使用。通道是交错的,而不是连续的。要获得单个组件,必须拆分()图像。另外,尽量避免直接访问基础imageData指针请参见以下答案:。它显示了如何分割垫子。它是用于实验室的,但只需使用CV_BGR2YCrCb而不是CV_BGR2Lab。使用“CV::split”是获取组件的最快方法吗?我只是使用NVENC实时压缩视频。NVENC使用YUV格式作为输入,但我的帧是RGB格式。因此,我需要将非常快速的RGB转换为YUV,并将其组件传递给NVENC API,因为我没有
cv::cvtColor
函数。我只有cvtcolor
。但是,我确实有cvSplit
和cv::split
函数。@但是,不可能有cvCvtColor
和cv::cvtColor,因为前者的实现只调用后者。您的问题几乎肯定与包含文件有关。您需要确保最终将这些
imgproc.hpp`包括在内。例如,#包括“opencv2/opencv.hpp”
将拾取它,或者:#包括“opencv2/imgproc/imgproc.hpp”
关于速度,如果您不需要split的所有三个通道,则使用混合通道()
会更快。您需要对cv::split计时,以确定它是否可能是一个瓶颈。cv::split必须处理您通过它的任何内容,因此,如果必要,您肯定可以更快地编写只处理您的情况的内容。查看convert.cpp中的源代码。您可以尝试实现一个没有NAryMatIterator的版本,例如。
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()