当前位置: 首页 > 知识库问答 >
问题:

CVCOLOR后如何获得YUV组件的参考?

胡泓
2023-03-14

我正在尝试使用cvtcolor方法将BGR转换为YUV,然后获取对每个组件的引用。源图像(IplImage1)具有以下参数:

  1. 深度=8
  2. n频道=3
  3. 颜色模型=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;

会有什么问题?

共有2个答案

杨乐意
2023-03-14

而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-频道:

束阳旭
2023-03-14

如果您确实必须使用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
 类似资料:
  • 问题内容: 我不知道NetworkX最近是否将其中一种方法调整为生成器,而不是返回列表,但是我正在寻找一种获取图形GC的好方法。 我有一个工作片段,但看起来效率很低: 有没有更清洁的方法? 问题答案: 在networkx 1.9中,返回迭代器(而不是排序列表)。迭代器产生的值未按排序顺序。所以要找到最大的,使用: 排序为O(n log n)。取最大值为O(n)。

  • 问题内容: 我正在使用php中的分页进行搜索功能,下面是我的代码,但是每当我单击下一个链接时,搜索查询都不会采用通过POST传递的变量。你能帮我么.. 问题答案: 您的代码中有几个问题。 第一的: 您使用的变量不正确。您有,但您应该使用与变量相同的方式,如下所示: 第二: 您正在解释“发布”的概念,并错误地单击了链接。您需要使用下一个和上一个按钮进行的​​操作是一个隐藏的表单,其中包含您需要的所有

  • 问题内容: 是否可以将值作为数组输入? 如果我尝试使用发送链接,而我想在php端使用,那么该值如何成为数组?因为现在正在返回。它是标题链接中的最后一个ID。有什么建议么? 问题答案: 在PHP中执行此操作的通常方法是输入您的URL而不是: 然后将是这些值的数组。它不是特别漂亮,但是可以直接使用。

  • 问题内容: 有一个问题- 我的主要活动是启动服务,然后关闭。当应用程序下次启动时,该应用程序应获得对该服务的引用并停止它。但是我不知道如何获得正在运行的服务的引用。拜托,我希望你能帮助我。谢谢。 问题答案:

  • 我正在做一个程序,它将计算一些东西,例如,我需要知道有多少员工是女性,它是在一个文件,我读取并保存在一个字符串数组。保存在数组中的数据为F为女性,M为男性。我怎么统计数组里面有多少个F(女)?我已经设置好了所有的东西,我需要知道的是如何计算数组中的值,数组中的特定值(只是F),而不是所有的值。 这是读取性别的代码(在示例中使用): 这是用来存储它们的变量: Gender.txt文件是这样的:

  • 问题内容: 如何在Java Swing中获得面板的所有组件? 有没有像C#这样的方法来处理JPanel的所有子组件? 问题答案: 您可以使用以下方法: