c++ - OpenCV findContours,如何检查两侧的颜色

标签 c++ opencv

我有一个使用 canny 边缘检测器派生的 Mat 对象,我使用 findContours 函数从此类图像中提取轮廓。现在我想为每个这样的轮廓做的是以某种方式检查两侧的颜色。

对于“颜色”位,我已经离散化了 HSI 颜色空间,但是我对如何在给定轮廓的两侧“选择颜色”感到非常困惑。

有没有办法轻松做到这一点?

最佳答案

您可以使用应用了 Canny 边缘检测器的图像来执行此操作。乘坐gradient那个形象。梯度是一个 vector 。如 wiki 页面图像(如下所示)所示,梯度指向增长率最大的方向。如果取负梯度,那么它指向下降率最大的方向。因此,如果您在轮廓点对图像的梯度进行采样,则这些点的正梯度和负梯度应指向轮廓点任一侧的区域。因此,您可以沿着这些方向对点进行采样,以了解您想要的颜色。

图像渐变:

gradient

示例 python 代码显示了如何为下面显示的简单图像完成此操作。它使用 Sobel 来计算梯度。

输入图片:

original image

Canny 边缘和采样点:

绿色:轮廓上的点

红色:指向正梯度方向

蓝色:指向负梯度方向

points

import cv2
import numpy as np
from matplotlib import pyplot as plt

im = cv2.imread('grad.png', 0)

dx = cv2.Sobel(im, cv2.CV_32F, 1, 0)
dy = cv2.Sobel(im, cv2.CV_32F, 0, 1)
edge = cv2.Canny(im, 64, 192)

dx = dx / np.sqrt(dx*dx + dy*dy + 0.01)
dy = dy / np.sqrt(dx*dx + dy*dy + 0.01)

r = 20

y, x = np.nonzero(edge)

pos1 = (np.int32(x[128]+r*dx[y[128], x[128]]), np.int32(y[128]+r*dy[y[128], x[128]]))
pos2 = (np.int32(x[128]-r*dx[y[128], x[128]]), np.int32(y[128]-r*dy[y[128], x[128]]))

im2 = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
cv2.circle(im2, pos1, 10, (255, 0, 0), 1)
cv2.circle(im2, pos2, 10, (0, 0, 255), 1)
cv2.circle(im2, (x[128], y[128]), 10, (0, 255, 0), 1)

plt.imshow(im2)

关于c++ - OpenCV findContours,如何检查两侧的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560011/

相关文章:

opencv - 在 openCv 中写入像素值大于 1 的浮点图像

C++ 提案函数返回类型

c++ - “INPUT”未在此范围内声明

c++ - std::uniform_real_distribution<double>(0,1) 能否返回大于 0.99999999999999994 的值?

android - Android OpenCV裁剪顶部图像部分

opencv - 从OpenCV的Essential矩阵正确解释 'recoverPose'之后的姿势(旋转和翻译)

c++ - 使用 OpenCV 将图像旋转 90 度的最简单方法?

c++ - OpenCV:实现我的 RANSAC 模型

c++ - 递归打印二叉搜索树的内容?

c++ - 解决外部库缺乏常量正确性的问题