cv2.circle(img_original, (int(center_s[0]), int(center_s[1])), int(radius_s), (255, 245, 0), 2) TypeError: 'NoneType' object is not subscriptable
时间: 2023-06-10 11:08:24 浏览: 122
这个错误通常是因为 `img_original` 变量没有被正确地初始化或者在处理过程中被修改为 `None` 类型的变量所导致的。可能的原因包括:
1. 图像文件没有被正确地加载,导致 `img_original` 变量为 `None`。
2. 在图像处理过程中出错,导致 `img_original` 变量被修改为 `None`。
3. 在代码中没有正确地初始化 `img_original` 变量。
你需要检查你的代码,确保 `img_original` 变量被正确地初始化并且没有在处理过程中被修改为 `None`。你也可以在报错的前面打印一下 `img_original` 变量看看它的值是不是 `None`,以便更好地定位问题所在。
相关问题
利用python写一段代码:输入一张阈值分析后的齿轮图像,在齿轮上拟合出齿顶圆和齿根圆,算出其齿轮齿顶圆和齿根圆的半径,在取齿顶圆和齿根圆的半径平均值做一个圆,将这个圆以内的所有像素设为0,圆以外的不变,则可以测得齿数。
### 回答1:
非常感谢您的问题!根据您的要求,我可以回答您的第一个问题。以下是利用Python实现输入一张阈值分析后的齿轮图像,在齿轮上拟合出齿顶圆和齿根圆,算出其齿轮齿顶圆和齿根圆的半径,在取齿顶圆和齿根圆的半径平均值做一个圆,将这个圆以内的所有像素设为0,圆以外的不变,则可以测得齿数的代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('gear.png', 0)
# 设置阈值
thresh_value = 127
# 二值化图像
ret, thresh = cv2.threshold(img, thresh_value, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 找到最大轮廓
cnt = max(contours, key=cv2.contourArea)
# 拟合椭圆
ellipse = cv2.fitEllipse(cnt)
# 计算齿根圆和齿顶圆半径
major_axis, minor_axis = ellipse[1]
pitch_dia = 2 * major_axis / np.pi
addendum = pitch_dia / 8
dedendum = pitch_dia / 6
root_dia = pitch_dia - 2 * addendum
top_dia = pitch_dia + 2 * dedendum
# 计算齿数
tooth_count = int(np.around(np.pi * pitch_dia / (top_dia - root_dia)))
# 取齿顶圆和齿根圆半径平均值做一个圆
mean_radius = int((top_dia + root_dia) / 4)
# 创建掩膜
mask = np.zeros_like(img)
# 绘制圆形掩膜
cv2.circle(mask, (int(ellipse[0][0]), int(ellipse[0][1])), mean_radius, (255, 255, 255), -1)
# 将圆形范围内的像素置为0
masked_img = cv2.bitwise_and(thresh, mask)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Masked Image', masked_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
请注意,这只是一个简单的示例代码,并且可能需要根据您的具体情况进行修改和调整。同时,这段代码仅供参考,我们无法对其准确性和适用性做出保证。希望这可以帮助您解决您的问题!
### 回答2:
以下是使用Python编写的代码实现上述功能:
```python
import cv2
import numpy as np
def calculate_gear_teeth(image_path):
# 读取图像
image = cv2.imread(image_path)
# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用阈值分析获取二值图像
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 提取最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 拟合齿顶圆
(x, y), radius = cv2.minEnclosingCircle(max_contour)
# 计算齿顶圆半径
gear_top_radius = int(radius)
# 拟合齿根圆
epsilon = 0.01 * cv2.arcLength(max_contour, True)
approx = cv2.approxPolyDP(max_contour, epsilon, True)
(x, y), radius = cv2.minEnclosingCircle(approx)
# 计算齿根圆半径
gear_bottom_radius = int(radius)
# 计算齿数
gear_teeth = int(np.round((gear_top_radius + gear_bottom_radius) / 2))
# 创建与原图像相同大小的掩模
mask = np.zeros_like(image)
# 在掩模上绘制圆形
center = (int(image.shape[1]/2), int(image.shape[0]/2))
cv2.circle(mask, center, gear_teeth, (255, 255, 255), -1)
# 将掩模应用于原图像
image_masked = cv2.bitwise_and(image, mask)
# 将圆内的像素值设为0
image_masked[np.where((image_masked == [255, 255, 255]).all(axis=2))] = [0, 0, 0]
# 显示图像
cv2.imshow('Masked Image', image_masked)
cv2.waitKey(0)
cv2.destroyAllWindows()
return gear_teeth
# 调用函数并传入图像路径
gear_teeth = calculate_gear_teeth('gear_image.png')
# 输出齿数
print('齿数:', gear_teeth)
```
使用该代码,只需将图像的路径传递给 `calculate_gear_teeth` 函数即可。该函数通过阈值分析和轮廓拟合,找到齿顶圆和齿根圆并计算出其半径。通过将两个半径的平均值,绘制成一个圆形掩模,并将该掩模应用于原图像,将圆内的像素值设为0。最后,返回齿数并输出结果。
### 回答3:
以下是一个使用Python实现上述功能的代码示例:
```python
import numpy as np
import cv2
def get_gear_teeth_count(image_path):
# 读取阈值分析后的齿轮图像
image = cv2.imread(image_path, 0)
# 使用OpenCV的HoughCircles函数拟合齿顶圆和齿根圆
circles = cv2.HoughCircles(image, cv2.HOUGH_GRADIENT, dp=1, minDist=10,
param1=50, param2=30, minRadius=10, maxRadius=30)
# 获取齿顶圆和齿根圆的半径
teeth_radii = np.mean(circles[0, :, 2])
# 创建一个与输入图像相同大小的全黑图像
mask = np.zeros_like(image)
# 获取圆心坐标
center_x, center_y = int(circles[0, 0, 0]), int(circles[0, 0, 1])
# 将圆内的像素设为0
for i in range(mask.shape[0]):
for j in range(mask.shape[1]):
if np.sqrt((i - center_x) ** 2 + (j - center_y) ** 2) <= teeth_radii:
mask[i, j] = 0
# 统计剩余非零像素的数量,即齿数
teeth_count = np.count_nonzero(mask)
return teeth_count
# 示例用法
image_path = 'gear_image.png' # 替换为实际的图像路径
teeth_count = get_gear_teeth_count(image_path)
print('齿数:', teeth_count)
```
上述代码使用了OpenCV库中的`HoughCircles`方法来拟合齿顶圆和齿根圆,获取其半径。然后,根据半径平均值创建了一个与输入图像相同大小的全黑图像,并将齿顶圆和齿根圆内的像素设为0。最后,统计剩余非零像素的数量,即可得到齿数。
阅读全文