我假设您有兴趣隔离图像的数字,并且您想手动指定 ROI(鉴于您编写的内容)。
您可以为 ROI 使用更好的坐标,并将其裁剪为新cv::Mat
坐标,以获得如下输出:
仅当您想隔离数字以稍后进行一些识别时,才在此图像上执行阈值才有意义。为此提供了一种很好的技术,cv::inRange()
它对所有通道(RGB 图像 == 3 通道)执行阈值操作。
注意:cv::Mat
按 BGR 顺序存储像素,在指定阈值时记住这一点很重要。
作为一个简单的测试,您可以执行从 B:70 G:90 R:100 到 B:140 G:140 R:140的阈值以获得以下输出:
不错!我稍微更改了您的代码以获得这些结果:
#include <cv.h>
#include <highgui.h>
#include <iostream>
int main()
{
cv::Mat image = cv::imread("input.jpg");
if (!image.data)
{
std::cout << "!!! imread failed to load image" << std::endl;
return -1;
}
cv::Rect roi;
roi.x = 165;
roi.y = 50;
roi.width = 440;
roi.height = 80;
/* Crop the original image to the defined ROI */
cv::Mat crop = image(roi);
cv::imwrite("colors_roi.png", crop);
/* Threshold the ROI based on a BGR color range to isolate yellow-ish colors */
cv::Mat dest;
cv::inRange(crop, cv::Scalar(70, 90, 100), cv::Scalar(140, 140, 140), dest);
cv::imwrite("colors_threshold.png", dest);
cv::imshow("Example", dest);
cv::waitKey();
return 0;
}