使用OpenCV查找最近的像素值

3

我想使用C++和OpenCV找到帧中最接近给定(R, G, B)值的像素。是否有OpenCV中的函数或解决方案可用?我在互联网上搜索了,但没有找到。普通的解决方案会导致内存问题,并且速度很慢,因为我要查找256种不同的颜色。任何建议或代码都将非常有帮助。


这个问题现在不太清楚。你到底想做什么?试着举个例子。 - Hannes Ovrén
让我们思考一下蓝色。我们知道它的BGR值为(255,0,0)。我想找到视频帧中最接近(255,0,0)值的像素。 - Mustafa Göl
1个回答

3
以下是计算每个像素的RGB颜色值与所寻找的RGB值之间L1距离的代码片段。然后,它返回具有最小距离的像素位置。
这段代码只是一个示例,基于RGB值之间的L1距离。该距离并不反映人类对颜色差异的感知。如果您想要找到与人眼最相似的像素,则应选择使用其他距离。查看维基百科上关于颜色差异的页面,以获取这些距离的列表。一旦您决定了其中一个,就可以非常容易地修改以下代码,以使用该距离而不是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;

我可以获取像素的BGR值,但是如何获取minLoc中的值? - Mustafa Göl
谢谢@And,这非常有帮助。 - Mustafa Göl
如果这个回答解决了你的问题,请接受这个答案。 - Andrzej Pronobis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接