Convertire un singolo colore con cvtColor

Ho un colore che voglio convertire in uno spazio colore diverso. È ansible usare cvtColor su un cv::Vec3f direttamente senza creare un 1×1 cv::Mat e cvtColor con quel pixel, usando cvtColor sul cv::Mat , ottenendo l’unico pixel dall’output? Ho provato quanto segue, ma non sembra che mi piaccia passare un vettore.

Eventuali suggerimenti?

 #include  #include  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; } 

Ho anche provato questo, ma ottenere un errore diverso:

 #include  #include  int main(int, char*[]) { cv::Mat_ hsv(cv::Vec3f(0.7, 0.7, 0.8)); std::cout << "HSV: " << hsv << std::endl; cv::Mat_ 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; } 

    Il tuo secondo approccio è corretto, ma hai cvtColor fonte e destinazione di diversi tipi e questo causa l’errore.

    Assicurati di avere sia hsv che bgr dello stesso tipo, CV_32F qui:

     #include  #include  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; } 

    Puoi usare Mat3f per brevità. È solo un typedef:

     typedef Mat_ Mat3f;