2016-03-02 16 views
5

Mam kolor, który chcę przekonwertować na inną przestrzeń kolorów. Czy można użyć cvtColor bezpośrednio na cv::Vec3f bez tworzenia 1x1 cv::Mat i zapełniania go tym pikselem, używając cvtColor na cv::Mat, a następnie uzyskać jedyny piksel z wyjścia? Próbowałem następujące, ale nie wydaje się, że lubię przekazywanie wektora.Konwersja jednego koloru z cvtColor

Wszelkie sugestie?

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

Próbowałem też to, ale dostać inny błąd:

#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 Nie, nie rozumiem, jak to by się tutaj dokonało? Czy mógłbyś opublikować kod pokazujący, jak go używać do konwersji przestrzeni kolorów? –

+0

Dlaczego 'cvtColor'? Jeśli chcesz przekonwertować tylko jeden wektor, to łatwiej będzie napisać funkcję konwersji. –

+0

@QuangHoang Ponieważ OpenCV ma już napisane mnóstwo konwersji. Zwykle dość trudne jest zaimplementowanie konwersji kolorów ze względu na wszystkie przypadki zawijania/krawędzi itd. –

Odpowiedz

3

Twoje drugie podejście jest poprawne, ale masz źródła i przeznaczenia różnych typów w cvtColor, a to powoduje błąd.

Pamiętaj, aby mieć zarówno hsv i bgr tego samego typu, CV_32F tutaj:

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

Można użyć Mat3f dla zwięzłości. To tylko typedef:

typedef Mat_<Vec3f> Mat3f; 
+0

Czy to przydziela pamięć dla "hsv"? Oznacza to, że mam już 'cv :: Vec3f' i chcę przekazać go do cvtColor. Jeśli zrobię 'cv :: Mat3f hsv (myVec)' to spowolni wewnętrzną pętlę? –

+0

Tak, to jest głęboko kopiowane dane. Tak, prawdopodobnie spowolni to. Najłatwiej jest: 1) nie używać cvtColor, ale stosować bezpośrednio konwersję kolorów, 2) jeśli masz pętlę, prawdopodobnie masz dużo 'Vec3f'. Możesz stworzyć macierz i przekazać całą macierz bez pętli – Miki

+0

1) Masz na myśli napisać sam? Czy istnieje bardziej bezpośredni sposób na wywołanie implementacji OpenCV? 2) W rzeczywistości mam obraz, ale nie mam wystarczającej ilości pamięci, aby przekonwertować go na zmienną (HSV) na urządzeniu mobilnym. W związku z tym wykonywałem konwersje i operacje na pikselach, więc mogłem zacząć od obrazu 8-bitowego, a skończyłem z obrazem 8-bitowym i nigdy nie potrzebowałem konstrukcji obrazu 32-bitowego. –

Powiązane problemy