python - 检测图像的最外边缘并基于它进行绘图

标签 python opencv math image-processing angle

我正在从事一个可以通过图像计算肘关节角度的项目。我努力的部分是图像处理。

目前正在使用 Intel RealSense R200 在 Python 中执行此操作(尽管可以认为我正在使用图像输入)。

我正在尝试检测左图像的边缘,这样我就可以获得中心图像,旨在提取外部轮廓(右图片):

知道从角里出来的两根 pipe 的边会平行(橙色的两条边和绿色的两条边平行是同一种颜色)...

...我正在尝试构建与两对颜色等距的点的 2 个轨迹,然后“外推到中间”以计算角度:

我已经看到了第二张图片,不可靠的是,我看到了第三张图片。我非常乐于接受建议,如果有任何帮助,我将不胜感激。

最佳答案

我会使用以下方法尝试找到问题中提供的四行。

<强>1。读取图像,并将其转换为灰度

import cv2
import numpy as np
rgb_img = cv2.imread('pipe.jpg')
height, width = gray_img.shape
gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)

<强>2。在图像顶部添加一些白色填充(只是为了有一些额外的背景)

white_padding = np.zeros((50, width, 3))
white_padding[:, :] = [255, 255, 255]
rgb_img = np.row_stack((white_padding, rgb_img))

结果图像 - white padded image 3. 反转灰度图并在顶部应用黑色填充

gray_img = 255 - gray_img
gray_img[gray_img > 100] = 255
gray_img[gray_img <= 100] = 0
black_padding = np.zeros((50, width))
gray_img = np.row_stack((black_padding, gray_img))

Black padded image

4.使用Morphological closing填充图像中的空洞——

kernel = np.ones((30, 30), np.uint8)
closing = cv2.morphologyEx(gray_img, cv2.MORPH_CLOSE, kernel)

closed image 5. 使用 Canny 边缘检测找到图像中的边缘 -

edges = cv2.Canny(closing, 100, 200)

pipe edges image 6. 现在,我们可以使用 openCV 的 HoughLinesP 函数在给定图像中查找直线 -

minLineLength = 500
maxLineGap = 10
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, None, 50, 100)
all_lines = lines[0]
for x1,y1,x2,y2 in lines[0]:
    cv2.line(rgb_img,(x1,y1),(x2,y2),(0,0,255),2)

enter image description here 7.现在,我们必须找到最右边的两条水平线和最底部的两条垂直线。对于水平线,我们将使用 (x2, x1) 按降序对线进行排序。此排序列表中的第一行将是最右边的垂直线。跳过这一点,如果我们采用接下来的两行,它们将是最右边的水平线。

all_lines_x_sorted = sorted(all_lines, key=lambda k: (-k[2], -k[0]))
for x1,y1,x2,y2 in all_lines_x_sorted[1:3]:
    cv2.line(rgb_img,(x1,y1),(x2,y2),(0,0,255),2)

horizontal lines image 8. 类似地,可以使用 y1 坐标按降序对行进行排序,排序列表中的前两行将是最底部的垂直行。

all_lines_y_sorted = sorted(all_lines, key=lambda k: (-k[1]))
for x1,y1,x2,y2 in all_lines_y_sorted[:2]:
    cv2.line(rgb_img,(x1,y1),(x2,y2),(0,0,255),2)

vertical lines image 9. 带有两条线的图像 -

final_lines = all_lines_x_sorted[1:3] + all_lines_y_sorted[:2]

final lines

因此,获得这 4 条线可以帮助您完成剩余的任务。

关于python - 检测图像的最外边缘并基于它进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777585/

相关文章:

计算两个 3d 旋转矩阵之间的面对弧

python - 如何将字典值分配给 user_id 以创建对象

python - Python 中的函数定义

python - SQLAlchemy + postgres : (InternalError) current transaction is aborted, 命令被忽略,直到事务 block 结束

python - 在 Apache Spark (pyspark 2.4) 中同一行的数据帧集合列表中获取重复项

python - 如何从 pytorch 模型并行化模型预测?

OpenCV 重新安装问题

c++ - 使用opencv提取Kinect的深度图像

c# - 两个数组的乘积之和(点积)

java - JAVA 和 Delphi 中的数学函数给出不同的结果