如何使用 OpenCV 查找图像中三角形的方向

2024-03-19

我试图找到图像中三角形的方向。下面是图片:

这些三角形指向上/下/左/右。这不是真实的图像。我已经使用精明的边缘检测来查找边缘,然后找到轮廓,然后膨胀的图像如下所示。

我寻找方向的逻辑:

我想使用的逻辑是,在三个角坐标中,如果我可以识别三角形的基坐标(具有相同的横坐标或纵坐标值坐标),我可以制作一个基向量。然后可以使用单位向量和基向量之间的角度来识别方向。但该方法只能判断上下左右,无法区分上下左右。我尝试使用找到角点cv2.goodFeaturesToTrack但据我所知,它只给出了整个图像中最有效的 3 个点。所以我想知道是否有其他方法可以找到三角形的方向。

这是我在 python 中区分三角形/正方形和圆形的代码:

#blue_masking
mask_blue=np.copy(img1)
row,columns=mask_blue.shape
for i in range(0,row):
    for j in range(0,columns):
        if (mask_blue[i][j]==25):
            mask_blue[i][j]=255
        else: 
            mask_blue[i][j]=0
blue_edges = cv2.Canny(mask_blue,10,10)
kernel_blue = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))
dilated_blue = cv2.dilate(blue_edges, kernel)
blue_contours,hierarchy = 
cv2.findContours(dilated_blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in blue_contours:
    area = cv2.contourArea(cnt)
    perimeter = cv2.arcLength(cnt,True)
    M = cv2.moments(cnt)
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    if(12<(perimeter*perimeter)/area<14.8):
        shape="circle"
    elif(14.8<(perimeter*perimeter)/area<18):
        shape="squarer"
    elif(18<(perimeter*perimeter)/area and area>200):
        shape="triangle"
    print(shape) 
    print(area)
    print((perimeter*perimeter)/area,"\n")
    
cv2.imshow('mask_blue',dilated_blue)
cv2.waitKey(0)
cv2.destroyAllWindows()

  

源图像可以在这里找到:img1 https://github.com/UJ5/Deep-learning-/blob/main/gray.png

请帮忙,如何找到三角形的方向?
谢谢。


假设您只有四种情况:[上、下、左、右],此代码应该适合您。

这个想法很简单:

  1. 获取轮廓的边界矩形。使用:box = cv2.boundingRect(contour_pnts)
  2. 使用边界矩形裁剪图像。
  3. 使用以下命令垂直和水平缩小图像Sum选项。现在您已获得沿每个轴的像素总和。总和最大的轴决定三角形底边是垂直还是水平。
  4. 要确定三角形是指向左/右还是指向上/下:您需要检查边界矩形中心是在最大列/行之前还是之后:

代码(假设您从裁剪后的图像开始):

ver_reduce = cv2.reduce(img,  0, cv2.REDUCE_SUM, None, cv2.CV_32F)
hor_reduce = cv2.reduce(img,  1, cv2.REDUCE_SUM, None, cv2.CV_32F)

#For smoothing the reduced vector, could be removed
ver_reduce = cv2.GaussianBlur(ver_reduce, (3, 1), 0)
hor_reduce = cv2.GaussianBlur(hor_reduce, (1, 3), 0)

_,ver_max, _, ver_col = cv2.minMaxLoc(ver_reduce)
_,hor_max, _, hor_row = cv2.minMaxLoc(hor_reduce)

ver_col = ver_col[0]
hor_row = hor_row[1]

contour_pnts = cv2.findNonZero(img) #in my code I do not have the original contour points

rect_center, size,  angle = cv2.minAreaRect(contour_pnts )

print(rect_center)

if ver_max > hor_max:
    if rect_center[0] > ver_col:
        print ('right')
    else:
        print ('left')
else:
    if rect_center[1] > hor_row:
        print ('down')
    else:
        print ('up')

Photos:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 OpenCV 查找图像中三角形的方向 的相关文章

随机推荐

  • 更改文本文件的默认“复制到输出目录”设置

    有谁知道是否有办法更改 Visual Studio 2008 中文件类型的默认 复制到输出目录 设置 我经常将文本文件添加到我的项目中 它们可以是自述文件中的任何内容 或一些使用信息 或应用程序在运行时实际使用的测试文件 但我从来没有添加过
  • Devise Oauth Twitter:OAuth::未经授权禁止 403

    我正在尝试使用 Devise 实现 Oauth Twitter 我在 Twitter 上创建了应用程序我已将回调 url 设置为 http 本地主机 3000 http localhost 3000我已将其添加到 config initia
  • 会话和基于令牌的身份验证之间的技术差异

    我正在写我的学士学位 其中我需要找出哪种身份验证 授权方法最适合我正在合作的公司 因此 我一直在比较基于会话和基于令牌的身份验证方法 但对于令牌如何工作以及它们如何比会话身份验证更好 我不清楚以下几点 我 100 清楚的唯一好处是 令牌可以
  • 将精确的 cv::Mat 图像存储在 sqlite3 数据库中

    有什么办法可以准确存储cv Mat使用 sqlite3 格式化数据Qt 因为我将来将使用相同的 cv Mat 格式 我尝试将图像转换为无符号字符 他们存储它 但这对我不起作用 还有其他技术吗 您可以将 cv Mat 序列化为 QByteAr
  • nodejs ffmpeg在特定时间播放视频并将其流式传输到客户端

    我正在尝试使用 nodeJS 和 ffmpeg 制作一个基本的在线视频编辑器 为此 我需要执行 2 个步骤 设置客户端视频的进出时间 要求客户端在特定的时间观看视频 并切换视频的位置 这意味着 如果使用单个视频作为输入 并将其分割成更小的部
  • java.io.InvalidClassException:本地类不兼容:

    我创建了客户端和服务器 然后在客户端添加了一个类用于序列化目的 然后只需转到硬盘驱动器中客户端的文件夹并将其复制粘贴到服务器对应的位置即可classname class and classname java分别 它在我自己的笔记本电脑上运行
  • 修改后的先序树遍历中的路径

    我已经实现了修改后的预序树遍历正如这里所解释的 http www sitepoint com hierarchical data database 2 我的树是这样的 ref name lft rgt NULL base 1 8 2 bas
  • 前向声明中的字段类型不完整[重复]

    这个问题在这里已经有答案了 我使用以下简单文件重现错误 它说 字段的类型 Foo 不完整 bar h class Foo class Bar private int x Foo foo error incomplete type publi
  • 受保护析构函数的基本原理

    我注意到许多 Poco 类都有一个受保护的析构函数 这使得它们的编码变得更加烦人 例如 这是我的一些代码 struct W2 Poco Util WinRegistryConfiguration typedef Poco Util WinR
  • Android 对话框,按下按钮时保持对话框打开

    我想在按下按钮时保持对话框打开 目前正在关闭 AlertDialog Builder builder new AlertDialog Builder this builder setMessage Are you sure you want
  • 在 javascript 资源中使用 Rails 辅助方法

    有没有办法使用 Rails 辅助方法 更具体地说 是 javascript 资源文件中的路径辅助方法 这个文件foo js coffee erb bar val 如果我能从 erubis 得到我会很高兴 bar val path to cr
  • 创建一段时间后删除会话文件

    我将会话保存在 temp 目录中的另一个目录中 说 session目录 使用session save path session 此外 还有一个代码可以在创建和注销 10 分钟后终止会话 但我提到 如果用户登录并关闭计算机 我的注销和会话销毁
  • 向 UITextField 添加不可编辑的文本后缀

    我有一个 UITextField 我想添加一个 所有输入文本的后缀 用户不应该能够删除这个 或在其右侧添加文本 解决这个问题的最佳方法是什么 Use the UITextFieldDelegate http developer apple
  • 转置前导维度为 N 的一维数组

    如何在没有额外空间的情况下转置前导维度为 N 的一维数组 任何语言都可以 我的一维就地矩阵转置解决方案 mn M N M rows and N columns q mn 1 i 0 Index of 1D array that repres
  • Chrome 多功能框特殊字符抛出错误

    我正在编写一个基本的 Chrome 扩展程序 以通过 JSON 源在多功能框中添加建议 几乎所有输入的查询都会在建议下拉列表中显示预期的结果 然而 每当描述中返回与号 时 Chrome 就会抛出错误 抛出的错误读取 xmlParseEnti
  • 获取句柄并写入启动我们进程的控制台

    我怎样才能写入一些已经打开的控制台的标准输出 我通过这段代码找到了我需要的控制台 IntPtr ptr GetForegroundWindow int u GetWindowThreadProcessId ptr out u Process
  • C++ 相当于 Java 的 andThen() 函数来组合新函数

    在Java中 您可以执行以下代码 Function
  • XSLT 转换抛出错误

    我有如下的xml
  • 在 Java 中,如何使用继承来简化代码? (安卓开发)

    在各种活动中我都有非常相似的方法 例如 Override public void onClick View v switch v getId case R id ibHome Intent menuIntent new Intent v g
  • 如何使用 OpenCV 查找图像中三角形的方向

    我试图找到图像中三角形的方向 下面是图片 这些三角形指向上 下 左 右 这不是真实的图像 我已经使用精明的边缘检测来查找边缘 然后找到轮廓 然后膨胀的图像如下所示 我寻找方向的逻辑 我想使用的逻辑是 在三个角坐标中 如果我可以识别三角形的基