使用 cvtColor 转换单一颜色



我有一种颜色,我想将其转换为不同的颜色空间。是否可以直接在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;
}

我也试过这个,但得到一个不同的错误:

#include <iostream>
#include <opencv2/opencv.hpp>
int main(int, char*[])
{
    cv::Mat_<cv::Vec3f> hsv(cv::Vec3f(0.7, 0.7, 0.8));
    std::cout << "HSV: " << hsv << std::endl;
    cv::Mat_<cv::Vec3b> bgr;
    cvtColor(hsv, bgr, CV_HSV2BGR); // OpenCV Error: Assertion failed (!fixedType() || ((Mat*)obj)->type() == mtype) in create
    std::cout << "BGR: " << bgr << std::endl;
    return EXIT_SUCCESS;
}

您的第二种方法是正确的,但是您在cvtColor中具有不同类型的源和目标,这会导致错误。

确保同时具有相同类型的hsvbgrCV_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;
}

为简洁起见,您可以使用Mat3f。它只是一个类型定义:

typedef Mat_<Vec3f> Mat3f;

最新更新