使用OpenCV查找最近的像素值

时间:2015-05-31 18:22:22

标签: c++ opencv video-processing

我想使用OpenCV使用C ++在帧中找到最近的(R,G,B)值。给出(R,G,B)值。 OpenCV中是否有任何功能或解决方案?我在互联网上搜索但我无法找到。普通的解决方案会导致内存问题而且运行缓慢,因为我想找到256种不同的颜色。任何建议或代码都会非常有用吗?

1 个答案:

答案 0 :(得分:3)

下面,您将找到一个代码段,用于计算每个像素的RGB颜色值与您查找的RGB值之间的L1距离。然后,它返回具有最小距离的像素的位置。

此代码只是一个示例,基于RGB值之间的L1距离。距离反映了人类对色差的感知。如果您想要找到与人眼最相似的像素,则可以选择使用距离。查看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;