使用 cvtColor 转换单一颜色
Convert a single color with cvtColor
我有一种颜色想要转换成另一种颜色 space。是否可以直接在 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
中的源和目标类型不同,这会导致错误。
确保 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;
}
为简洁起见,您可以使用 Mat3f
。这只是一个 typedef:
typedef Mat_<Vec3f> Mat3f;
我有一种颜色想要转换成另一种颜色 space。是否可以直接在 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
中的源和目标类型不同,这会导致错误。
确保 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;
}
为简洁起见,您可以使用 Mat3f
。这只是一个 typedef:
typedef Mat_<Vec3f> Mat3f;