- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在学习 OpenCv。我有一个斜齿轮图像来寻找齿。
到目前为止,我一直试图找到轮廓,然后数 dentry 。我能够找到轮廓以及轮廓的坐标。但我坚持数 dentry 。因为我是 OpenCV 的新手,所以我尝试寻找 dentry 的方式可能不正确。
我的代码:
import cv2
import numpy as np
import scipy as sp
import imutils
from skimage.morphology import reconstruction
import csv
raw_image = cv2.imread('./Gear Image/new1.jpg')
#cv2.imshow('Original Image', raw_image)
#cv2.waitKey(0)
bilateral_filtered_image = cv2.bilateralFilter(raw_image, 5, 175, 175)
#cv2.imshow('Bilateral', bilateral_filtered_image)
#cv2.waitKey(0)
edge_detected_image = cv2.Canny(bilateral_filtered_image, 75, 200)
#cv2.imshow('Edge', edge_detected_image)
#cv2.waitKey(0)
contours, hierarchy = cv2.findContours(edge_detected_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour_list = []
for contour in contours:
approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
area = cv2.contourArea(contour)
if ((len(approx) > 5) & (len(approx) < 25) & (area > 50) ):
contour_list.append(contour)
cv2.drawContours(raw_image, contour_list, -1, (255,0,0), 2)
c = max(contours, key = cv2.contourArea)
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
cv2.circle(raw_image, (cX, cY), 5, (142, 152, 100), -1)
cv2.putText(raw_image, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (142, 152, 100), 2)
contour_length = "Number of contours detected: {}".format(len(contours))
cv2.putText(raw_image,contour_length , (20,40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (142, 152, 100), 2)
for c in range(len(contours)):
n_contour = contours[c]
for d in range(len(n_contour)):
XY_Coordinates = n_contour[d]
print(len(coordinates))
print(XY_Coordinates)
print(type(XY_Coordinates))
print(XY_Coordinates[0,[0]])
print(XY_Coordinates[0,[1]])
cv2.imshow('Objects Detected',raw_image)
cv2.waitKey(0)
在这个阶段之后,我该如何计算 dentry ?我可以使用坐标来计算间隔并计算 dentry 。
或者在这个阶段之后还有其他方法可以计算 dentry 吗?
最佳答案
我的解决方案的第一部分类似于@HansHirse 发布的答案,但我使用了不同的方法来计算 dentry 数量。我的完整代码可以在这里找到:link to full code for python3 opencv4 .在继续之前检查是否正确检测到齿轮的外轮廓。如果未正确检测到齿轮,则其余答案将无效。
在数齿数之前,我“打开”了齿轮。我通过扫过齿轮并计算从齿轮中心到轮齿外侧的距离来做到这一点。
这是我用来扫描齿轮并找到从齿轮中心到齿轮外侧的距离的代码:
# Start at angle 0, and increment the angle 1/200 rad
angle = 0
increment = 1/200
# Create a list for the distances from the centroid to the edge of the gear tooth
distances = []
# Create an image for display purposes
display_image = raw_image.copy()
# Sweep around the circle (until one full revolution)
while angle < 2*math.pi:
# Compute a ray from the center of the circle with the current angle
img_size = max(raw_image.shape)
ray_end = int(math.sin(angle) * img_size + cX), int(math.cos(angle) * img_size + cY)
center = cX, cY
# Create mask
mask = np.zeros((raw_image.shape[0], raw_image.shape[1]), np.uint8)
# Draw a line on the mask
cv2.line(mask, center, ray_end, 255, 2)
# Mask out the gear slice (this is the portion of the gear the us below the line)
gear_slice = cv2.bitwise_and(raw_image, raw_image, mask = mask)
# Threshold the image
_, thresh = cv2.threshold(cv2.cvtColor(gear_slice, cv2.COLOR_BGR2GRAY), 0 , 255, 0)
# Find the contours in the edge_slice
_, edge_slice_contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Get the center of the edge slice contours
M = cv2.moments(max(edge_slice_contours, key = cv2.contourArea))
edge_location = int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])
cv2.circle(display_image, edge_location, 0, (0,255,0), 4)
# Find the distance from the center of the gear to the edge of the gear...at this specific angle
edge_center_distance = distance(center, edge_location)
# Find the xy coordinates for this point on the graph - draw blue circle
graph_point = int(angle*0.5*raw_image.shape[1]/math.pi), int(edge_center_distance+ 1.5*gear_radius)
cv2.circle(display_image, graph_point, 0, (0,255,0), 2)
# Add this distance to the list of distances
distances.append(-edge_center_distance)
# Create a temporary image and draw the ray on it
temp = display_image.copy()
cv2.line(temp, ray_end, (cX,cY), (0,0,255), 2)
# Show the image and wait
cv2.imshow('raw_image', temp)
vid_writer.write(temp)
k = cv2.waitKey(1)
if k == 27: break
# Increment the angle
angle += increment
# Clean up
cv2.destroyAllWindows()
结果是与齿轮中心的齿距作为角度的函数。
import matplotlib.pyplot as plt
plt.plot(distances)
plt.show()
现在计算 dentry 要容易得多,因为它们是函数中的峰(或者在这种情况下是谷 - 稍后会详细介绍)。为了计算峰值,我采取了 Fourier transform的齿距函数。
import scipy.fftpack
# Calculate the Fourier transform
yf = scipy.fftpack.fft(distances)
fig, ax = plt.subplots()
# Plot the relevant part of the Fourier transform (a gear will have between 2 and 200 teeth)
ax.plot(yf[2:200])
plt.show()
傅立叶变换的波峰出现在37°,因此有37个波谷和38个轮齿。
num_teeth = list(yf).index(max(yf[2:200])) - 1
print('Number of teeth in this gear: ' + str(num_teeth))
关于python - 通过 python opencv 查找齿轮的 dentry ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55282855/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在尝试进行图像处理,其中系统会提示用户将嘴部包含在图像中。一旦用户执行此操作,我的应用程序应该识别可识别 dentry 的像素(颜色从白色到黄色),然后我想仅使这些像素变亮。谁能给我指导如何继续?
这个类显示autoCompleteTextField,但是如果你在textField中写名称医生,那么在变量医生中显示太多结果如何减少 dentry 仅显示十个结果 import UIKit clas
我有一个下巴图像,如图所示,我希望在每颗 dentry 上都有一个听众,并通过相对布局向每颗 dentry 图像添加按钮成功,但它在一个屏幕上工作正常但得到另一方面困惑..我怎样才能让它在所有屏幕尺寸
根据 atomic_ops.txt在 Linux 内核中, all users of atomic_t should treat atomic_read() and atomic_set() as s
我正在开发一个无状态文件系统来浏览基于网络的目录和文件。我在主机上有自己的文件/目录 inode 缓存。我设计我的文件系统模块时,当从 VFS 层调用 evict_inode() 函数时,我的主机 i
刚刚从 https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux
我正在尝试抓取论坛以生成用于分析的数据集。 选择主题时,类名有一个尾随的唯一编号,例如: 我如何抓取并返回包含所有类名的字符串列表,例如: ["structItem structItem--threa
我正在开发一个模块,用于在打开时读取文件 xattributes。我已经连接了 sys_open,因此我需要在不打开文件的情况下获取文件的 dentry。简而言之,我有 inode 和绝对路径,但很难
我知道 iOS 5.0 上的 Core Image supports facial detection ( another example of this ),它给出了面部的整体位置,以及面部内眼睛和
我在考试中遇到了以下问题: 在 ext3 文件系统中,dentry 的数量高于 i-node 的数量。 我必须用 True 或 False 来回答并解释。 我的回答: 这是错误的,因为 dentrie
是否可以从给定的 dentry 和 inode 构造绝对路径? 谢谢大家 最佳答案 如果你有一个struct path(或者可以构造一个),看看tomoyo是如何做到的: http://lxr.lin
我对图像处理和对象检测非常陌生。我想提取/识别下图中 dentry 的位置和尺寸: 这是我迄今为止使用 OpenCV 尝试过的内容: import cv2 import numpy as np pla
我编写了一个系统调用来打开一个目录并获取文件对象和 dentry 结构。我正在尝试使用 list_for_each() 宏列出所有条目,包括子目录中的条目。问题是它只显示当前在 dentry 缓存中的
我正在学习 OpenCv。我有一个斜齿轮图像来寻找齿。 到目前为止,我一直试图找到轮廓,然后数 dentry 。我能够找到轮廓以及轮廓的坐标。但我坚持数 dentry 。因为我是 OpenCV 的新手
我正在研究 Linux 内核代码,尤其是文件系统部分。我发现当内核启动时,一些 dentry 对象被分配给根目录“/”。为什么需要在RAM中分配多个根目录副本?而且,由于看起来dcache(dentr
因此,我可以在多个位置挂载 sysfs(/sys 的虚拟文件系统),并且每次都会看到相同的内容。同样,我可以在多个安装点安装相同的 block 设备(如/dev/sda1)。 我现在正在为我的内核编写
我正在创建一个简单的 debugfs里面的文件/sys/kernel/debug/test/testFile使用以下代码: pDebugfs = debugfs_create_dir(name, NU
完成后,link/rm/mv 是否立即将 dentry 元数据同步到永久存储?如果没有,什么时候? 最佳答案 来自https://www.kernel.org/doc/Documentation/sy
我正在编写我自己的内核模块,它捕获 vfs_mkdir(struct inode *, struct dentry *, int) 内核函数调用并尝试记录发生此调用的磁盘路径名。 我想使用 dentr
我是一名优秀的程序员,十分优秀!