Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CVCOLOR后如何获得YUV组件的参考?_C++_Opencv_Color Scheme - Fatal编程技术网

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
)具有以下参数:

  • 深度=8
  • n通道=3
  • 颜色模型=RGB
  • channelSeq=BGR
  • 宽度=1620
  • 高度=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;
    

    有什么问题吗?

    如果您确实必须使用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()