使用OpenCV检测颜色的最有效方法
Most efficient method to detect color using OpenCV?
我使用在图像中心附近的某个地方设置了一个感兴趣的区域
Mat frame;
//frame has been initialized as a frame from a camera input
Rect roi= cvRect(frame.cols*.45, frame.rows*.45, 10, 8);
image_roi= frame(roi);
//I stoped here not knowing what to do next
我使用的是相机,在任何时候,当我抓取一帧时,ROI都会在30%到100%之间,填充我想要的颜色,在这种情况下是红色。如果红色出现在我的当前帧中,最有效的方法是什么?
解决方案:
image_roi= frame(roi);// a frame from my camera as a cv::Mat
cvtColor(image_roi, image_roi, CV_BGR2HSV);
thrs= new Mat(image_roi.rows, image_roi.cols, CV_8UC1);//allocate space for new img
inRange(image_roi, Scalar(0,100,100), Scalar(12,255,255), *thrs);//do hsv thresholding for red
for(int i= 0; i < thrs->rows; i++)//sum up
{
for(int j=0; j < thrs->cols; j++)
{
sum= sum+ thrs->data[(thrs->rows)* i + j];
}
}
if(sum> 100)//my application only cares about red
cout<<"Red"<<endl;
else
cout<<"White"<<endl;
sum=0;
我假设您只想知道ROI中红色的百分比。如果不正确,请澄清。
我会扫描ROI,并将每个像素转换为更好的颜色空间进行颜色比较,例如YCbCr或HSV。然后,我会计算色调在红色色调的某个增量内的像素数(通常在色轮上为0度)。你可能需要处理一些边缘情况,即亮度或饱和度太低,人类无法认为它们是红色的,尽管从技术上讲它们是红色,这取决于你想要实现的目标。
此解决方案不仅应解决红色问题,还应解决任何颜色分布:
- 获取ROI的颜色直方图,二维色调和饱和度直方图(按照这里的示例)
- 使用
calcBackProject
将直方图投影回完整图像。您将获得较大的像素值,这些值表示直方图的模式附近的颜色(在本例中为红色) - 对结果设置阈值,以获得更匹配分布的像素(在本例中,为"最佳红色")
例如,该解决方案可用于获得一个简单但功能非常强大的皮肤检测器。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法