2016-03-02 9 views
5

Ho un colore che voglio convertire in uno spazio colore diverso. È possibile utilizzare cvtColor su un cv::Vec3f direttamente senza creare un 1x1 cv::Mat e popolarlo con quel pixel, utilizzando cvtColor su cv::Mat, quindi prelevando l'unico pixel dall'output? Ho provato quanto segue, ma non sembra che mi piaccia passare un vettore.Convertire un singolo colore con cvtColor

Qualche suggerimento?

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

ho anche provato, ma ottenere un errore diverso:

#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; 
} 
+0

@Nacho No, non vedo come sarebbe la conversione attuale qui? Potresti pubblicare un codice che mostra come usarlo per fare una conversione dello spazio colore? –

+0

Perché 'cvtColor'? Se vuoi solo convertire un solo vettore, immagino che sarebbe più facile scrivere una funzione di conversione. –

+0

@QuangHoang Perché OpenCV ha già un sacco di conversioni scritte. Di solito è abbastanza complicato implementare una conversione del colore a causa di tutti i casi di wrapping/edge, ecc. –

risposta

3

Il secondo approccio è corretto, ma si deve origine e la destinazione di diversi tipi in cvtColor, e che causa l'errore.

Essere sicuri di avere sia hsv e bgr dello stesso tipo, CV_32F qui:

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

È possibile utilizzare Mat3f per brevità. È solo un typedef:

typedef Mat_<Vec3f> Mat3f; 
+0

Questa memoria allocatrice per 'hsv'? Cioè, diciamo che ho già un 'cv :: Vec3f' e voglio passarlo a cvtColor. Se faccio 'cv :: Mat3f hsv (myVec)' questo rallenterà un ciclo interno? –

+0

Sì, è una copia profonda dei dati. Sì, probabilmente rallenterà le cose. La cosa più semplice è: 1) non usare cvtColor, ma applicare direttamente la conversione del colore, 2) se hai un ciclo, probabilmente hai un sacco di 'Vec3f'. Puoi creare una matrice e passare l'intera matrice senza il ciclo – Miki

+0

1) Vuoi dire scrivilo io stesso? O c'è un modo più diretto per chiamare le implementazioni di OpenCV? 2) In realtà ho un'immagine, ma non ho abbastanza memoria per convertirla in float (HSV) su un dispositivo mobile. Quindi stavo facendo le conversioni e le mie operazioni pixel alla volta, così ho potuto iniziare con un'immagine a 8 bit e finire con un'immagine a 8 bit e mai veramente bisogno di costruire l'immagine a 32 bit. –

Problemi correlati