2015-05-31 6 views
1

Я хочу найти ближайшие значения (R, G, B) в кадре с использованием C++ с использованием OpenCV. (R, G, B). Есть ли какая-либо функция или решение в OpenCV? Я искал в Интернете, но я не мог найти. Обычное решение вызывает проблемы с памятью, и оно работает медленно, потому что я хочу найти 256 разных цветов. Любое предложение или код будут очень полезны?Поиск ближайшего значения пикселя с помощью OpenCV

+0

Вопрос не имеет смысла прямо сейчас. Что именно ты пытаешься сделать? Попробуйте дать пример. –

+0

Давайте подумаем о синем. Мы знаем его значение BGR (255,0,0). Я хочу найти пиксель, который имеет ближайшее значение (255,0,0) в видеокадре. –

ответ

2

Ниже вы найдете фрагмент кода, который вычисляет расстояние L1 между значениями цвета RGB каждого пикселя и значением RGB, которое вы ищете. Затем он возвращает местоположение пикселя с минимальным расстоянием.

Этот код является лишь примером, основанным на расстоянии L1 между значениями RGB. Это расстояние НЕ ДЕЛАЕТ отражает человеческое восприятие разницы в цветах. Существует выбор расстояний, которые вы должны использовать вместо этого, если вы хотите найти пиксель, который будет выглядеть наиболее похожим на человеческий глаз. Ознакомьтесь с этой страницей в Википедии по адресу Color Difference, чтобы просмотреть список таких расстояний. После того, как вы решите, один из них, будет очень легко изменить код ниже, чтобы использовать это расстояние вместо L1. Если ваше приложение очень простое, вы можете уйти с кодом ниже.

// RGB values of the color you are looking for 
    int r = 0; 
    int g = 0; 
    int b = 255; 

    // Load image 
    cv::Mat img = cv::imread("image.png"); 

    // Split image into channels 
    cv::Mat channels[3]; 
    cv::split(img, channels); 

    // Find absolute differences for each channel 
    cv::Mat diff_r; 
    cv::absdiff(channels[2], r, diff_r); 
    cv::Mat diff_g; 
    cv::absdiff(channels[1], g, diff_g); 
    cv::Mat diff_b; 
    cv::absdiff(channels[0], b, diff_b); 

    // Calculate L1 distance 
    cv::Mat dist = diff_r + diff_g + diff_b; 

    // Find the location of pixel with minimum color distance 
    cv::Point minLoc; 
    cv::minMaxLoc(dist, 0, 0, &minLoc); 

    // Get the color of a pixel at minLoc 
    cout << img.at<cv::Vec3b>(minLoc) << endl; 
+0

Я могу достичь значений BGR пикселей, но Как я могу достичь значений в minLoc? –

+0

См. Мое редактирование (последняя строка кода) –

+0

Спасибо @ И это очень полезно. –

Смежные вопросы