C++ 使用cvtColor转换单一颜色

C++ 使用cvtColor转换单一颜色,c++,opencv,opencv3.0,C++,Opencv,Opencv3.0,我有一种颜色,我想转换成不同的颜色空间。是否可以在cv::Vec3f上直接使用cvtColor,而无需创建1x1cv::Mat并用该像素填充,在cv::Mat上使用cvtColor,然后从输出中取出唯一的像素?我尝试了以下方法,但似乎不喜欢通过向量 有什么建议吗 #include <iostream> #include <opencv2/opencv.hpp> int main(int, char*[]) { cv::Vec3f hsv; hsv[0]

我有一种颜色,我想转换成不同的颜色空间。是否可以在
cv::Vec3f
上直接使用
cvtColor
,而无需创建1x1
cv::Mat
并用该像素填充,在
cv::Mat
上使用
cvtColor
,然后从输出中取出唯一的像素?我尝试了以下方法,但似乎不喜欢通过向量

有什么建议吗

#include <iostream>

#include <opencv2/opencv.hpp>

int main(int, char*[])
{
    cv::Vec3f hsv;
    hsv[0] = .9;
    hsv[1] = .8;
    hsv[2] = .7;

    std::cout << "HSV: " << hsv << std::endl;

    cv::Vec3b bgr;
    cvtColor(hsv, bgr, CV_HSV2BGR); // OpenCV Error: Assertion failed (scn == 3 && (dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F)) in cvtColor

    std::cout << "BGR: " << bgr << std::endl; 

    return EXIT_SUCCESS;
}
#包括
#包括
int main(int,char*[])
{
cv::Vec3f-hsv;
hsv[0]=0.9;
hsv[1]=0.8;
hsv[2]=0.7;

std::cout第二种方法是正确的,但是在
cvtColor
中有不同类型的源和目标,这导致了错误

确保同一类型的
hsv
bgr
CV_32F
在此处:

#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    cv::Mat3f hsv(cv::Vec3f(0.7, 0.7, 0.8));

    std::cout << "HSV: " << hsv << std::endl;

    cv::Mat3f bgr;
    cvtColor(hsv, bgr, CV_HSV2BGR); 

    std::cout << "BGR: " << bgr << std::endl;

    return 0;
}

@Nacho不,我不知道这将如何在这里进行实际的转换?你能发布代码说明如何使用它进行颜色空间转换吗?为什么
cvtColor
?如果你只想转换一个向量,我想写一个转换函数会更容易。@QuangHoang,因为OpenCV已经编写了大量的转换。它通常是f由于所有的包装/边缘情况等,实现颜色转换非常困难。@callyalater我已经在出现的行上发布了错误。您的第二种方法是正确的。只需使用
cv::Mat\ubgr;
,因为源和目标必须具有相同的类型。此外,您还可以使用
Mat3f
,这是
Ma的类型定义这是为“hsv”分配内存吗?也就是说,我已经有了一个
cv::Vec3f
,我想把它传递给cvtColor。如果我有
cv::Mat3f hsv(myVec)
这会减慢内部循环吗?是的,这是深度复制数据。是的,可能会减慢速度。最简单的事情是:1)不要使用cvtColor,而是直接应用颜色转换,2)如果有循环,可能会有很多
Vec3f
。你可以制作一个矩阵并传递整个矩阵,而不需要循环1)你是说自己写lf?或者有更直接的方法调用OpenCV的实现吗?2)我实际上有一个图像,但我没有足够的内存将其转换为浮点(HSV)在移动设备上。因此,我一次像素地进行转换和操作,这样我就可以从8位图像开始,以8位图像结束,而不需要实际构建32位图像。1)是的。你可以借用OpenCV实现,查看
color.cpp
。好的,如果你想使用
tcolor
你需要
Mat
std::vector
对象。2)如果你能展示一些代码来获得想法,我们可以寻找一种有效的方法。这里有一个后续问题,也基本上说明了我在做什么(只是在整个像素图像上循环):-对此有什么想法吗?我们真的应该尝试更新文档(它只有前进档:)
#include <opencv2/opencv.hpp>
#include <iostream>

int main()
{
    cv::Mat3f hsv(cv::Vec3f(0.7, 0.7, 0.8));

    std::cout << "HSV: " << hsv << std::endl;

    cv::Mat3f bgr;
    cvtColor(hsv, bgr, CV_HSV2BGR); 

    std::cout << "BGR: " << bgr << std::endl;

    return 0;
}
typedef Mat_<Vec3f> Mat3f;