Android: ViewPager и HorizontalScrollVIew

Я пойду несколько иначе. Вместо определения интервалов диапазона для всех предопределенных цветов вы можете:

  1. Определить свои предопределенные цвета . Это будет палитра ваших возможных цветов
  2. . Учитывая цвет, который вы хотите проверить, вычислите расстояние от всех цветов в вашей палитре и сохраните ближайшую палитру / g3].
  3. Проверьте, достаточно ли найденного палитра .

В этом маленьком образце я использовал цветовое пространство BGR, так как хорошо ведется эвклидовое расстояние (norm двух цветов).

Вы можете использовать другое цветовое пространство, например, HSV, но вам нужно найти подходящее расстояние. Вы не можете использовать только значение H, поскольку вы будете пропускать черные / белые / серые цвета (как указано в @MSalters).

Итак, например, ваш цвет почти оранжевый 20, 130, 250, с соответствующей палитрой вы получите что-то вроде:

[20, 130, 250] is similar to orange
Distance with nearest color [0, 127, 255] is 20.8327

Код:

#include <opencv2/opencv.hpp>
#include <vector>
#include <map>
#include <string>
using namespace cv;
using namespace std;

// Needed to put Vec3b into a std::map
struct lessVec3b
{
    bool operator()(const Vec3b& lhs, const Vec3b& rhs) {
        return (lhs[0] != rhs[0]) ? (lhs[0] < rhs[0]) : ((lhs[1] != rhs[1]) ? (lhs[1] < rhs[1]) : (lhs[2] < rhs[2]));
    }
};


int main()
{
    // Define a set of predefined BGR colors
    map<Vec3b, string, lessVec3b> palette;
    palette[Vec3b(0, 0, 0)] = "black";
    palette[Vec3b(0, 0, 255)] = "red";
    palette[Vec3b(0, 255, 0)] = "green";
    palette[Vec3b(255, 0, 0)] = "blue";
    palette[Vec3b(0, 127, 255)] = "orange";

    // Your color
    Vec3b my_color(20, 130, 250); // almost orange

    // Look for nearest color in palette
    Vec3b nearest_color;
    string color_name;
    float min_distance = FLT_MAX;
    for (const auto& pal : palette)
    {
        float dist = norm(pal.first, my_color);
        if (dist < min_distance)
        {
            nearest_color = pal.first;
            color_name = pal.second;
            min_distance = dist;
        }
    }

    // Define a distance. This will behave like your ranges
    float th_distance = 1000.f;

    if (min_distance < th_distance)
    {
        cout << my_color << " is similar to " << color_name <<  endl;
    }
    else
    {
        cout << my_color << " is not in the palette" << endl;
    }
    cout << "Distance with nearest color " << nearest_color << " is " << min_distance << endl;

    return 0;
}
30
задан biegleux 26 September 2012 в 09:42
поделиться