2016-03-02 5 views
5

Ich habe eine Farbe, die ich in einen anderen Farbraum konvertieren möchte. Ist es möglich, cvtColor auf einem cv::Vec3f direkt zu verwenden, ohne ein 1x1 cv::Mat zu erstellen und es mit diesem Pixel zu bevölkern, indem man cvtColor auf dem cv::Mat verwendet und dann das einzige Pixel aus der Ausgabe holt? Ich habe das folgende versucht, aber es scheint nicht zu mögen, einen Vektor zu erhalten.Konvertiere eine einzelne Farbe mit cvtColor

Irgendwelche Vorschläge?

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

Ich habe auch versuchte das, aber eine andere Fehlermeldung erhalten:

#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 Nein, ich sehe nicht, wie das hier die tatsächliche Umwandlung tun würde? Können Sie Code zur Verwendung einer Farbraumkonvertierung posten? –

+0

Warum 'cvtColor'? Wenn Sie nur einen Vektor konvertieren möchten, wäre es einfacher, eine Konvertierungsfunktion zu schreiben. –

+0

@QuangHoang Da OpenCV bereits Tonnen von Conversions geschrieben hat. Es ist normalerweise ziemlich schwierig, eine Farbkonvertierung zu implementieren, da alle Umhüllungs-/Kantenfälle usw. enthalten sind. –

Antwort

3

Ihr zweiter Ansatz richtig ist, aber Sie haben Quell- und Ziel verschiedenen Typen in cvtColor, und das verursacht den Fehler.

Seien Sie sicher, dass beide hsv und bgr des gleichen Typs haben, CV_32F hier:

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

Sie Mat3f der Kürze halber verwenden können. Es ist nur ein typedef:

typedef Mat_<Vec3f> Mat3f; 
+0

Ist das Speicherzuweisung für 'HSV'? Das heißt, ich habe bereits ein 'cv :: Vec3f' und möchte es an cvtColor übergeben. Wenn ich 'cv :: Mat3f hsv (myVec)' mache, wird dies eine innere Schleife verlangsamen? –

+0

Ja, es ist ein tiefes Kopieren von Daten. Ja, wird wahrscheinlich die Dinge verlangsamen. Am einfachsten ist es: 1) nicht cvtColor verwenden, sondern direkt die Farbkonvertierung anwenden, 2) wenn Sie eine Schleife haben, haben Sie wahrscheinlich eine Menge 'Vec3f'. Sie können eine Matrix erstellen und die ganze Matrix ohne die Schleife übergeben – Miki

+0

1) Sie meinen, es selbst schreiben? Oder gibt es eine direktere Möglichkeit, die OpenCV-Implementierungen aufzurufen? 2) Ich habe tatsächlich ein Bild, aber ich habe nicht genug Speicher, um es in Float (HSV) auf einem mobilen Gerät zu konvertieren. Daher machte ich die Konvertierungen und meine Operationen Pixel-für-Mal, so dass ich mit einem 8-Bit-Bild beginnen und mit einem 8-Bit-Bild enden konnte und nie wirklich das 32-Bit-Bild konstruieren musste. –