鱼C论坛

 找回密码
 立即注册
查看: 3004|回复: 6

求一个图片捕捉框边的程序

[复制链接]
发表于 2023-5-10 20:18:48 | 显示全部楼层 |阅读模式
50鱼币
原图
10.jpg

处理后
11.jpg


框选内的RGB值,导入一个二维列表中。
输入长边与短边的长度。(有数据就可)

感激!

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-10 20:19:33 | 显示全部楼层
您可以使用Python中的OpenCV库来实现这个程序。以下是实现的步骤:

1. 读取原始图像并将其转换为灰度图像。
2. 使用Canny边缘检测算法检测图像中的边缘。
3. 使用霍夫变换检测图像中的直线。
4. 根据直线的位置计算出边框的位置。
5. 从原始图像中提取边框内的像素值,并将其存储在一个二维列表中。

下面是Python代码示例:
  1. import cv2
  2. # 读取原始图像并转换为灰度图像
  3. img = cv2.imread('original_image.jpg')
  4. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  5. # Canny边缘检测
  6. edges = cv2.Canny(gray, 50, 150, apertureSize=3)
  7. # 霍夫变换检测直线
  8. lines = cv2.HoughLines(edges, 1, cv2.cv2.PI/180, 200)
  9. # 计算边框位置
  10. for line in lines:
  11.     rho, theta = line[0]
  12.     a = np.cos(theta)
  13.     b = np.sin(theta)
  14.     x0 = a * rho
  15.     y0 = b * rho
  16.     x1 = int(x0 + 1000 * (-b))
  17.     y1 = int(y0 + 1000 * (a))
  18.     x2 = int(x0 - 1000 * (-b))
  19.     y2 = int(y0 - 1000 * (a))
  20.     # 绘制直线
  21.     cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
  22. # 提取边框内的像素值并存储在二维列表中
  23. box = []
  24. for x in range(x1, x2):
  25.     row = []
  26.     for y in range(y1, y2):
  27.         row.append(img[y, x])
  28.     box.append(row)
复制代码

其中, original_image.jpg 是原始图像的文件名。 x1 、 y1 、 x2 、 y2 是边框的位置。 box 是存储像素值的二维列表。您需要根据实际情况调整参数以获得最佳结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-11 08:01:32 | 显示全部楼层
isdkz 发表于 2023-5-10 20:19
您可以使用Python中的OpenCV库来实现这个程序。以下是实现的步骤:

1. 读取原始图像并将其转换为灰度图像 ...

非常感谢您的回复
程序运行时出现下面错误,请问是那出问题了。

   lines = cv2.HoughLines(edges, 1, cv2.cv2.PI/180, 200)
AttributeError: module 'cv2.cv2' has no attribute 'PI'
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-11 08:49:11 | 显示全部楼层
wgij007 发表于 2023-5-11 08:01
非常感谢您的回复
程序运行时出现下面错误,请问是那出问题了。

对不起,我犯了一个错误。在 OpenCV 中并没有定义 π (PI),您可以直接使用 Python 的 math 库中的 π。所以,您应该将  cv2.cv2.PI/180  替换为  math.pi/180 。

请看下面的修正后的代码:

  1. import cv2
  2. import numpy as np
  3. import math

  4. # 读取原始图像并转换为灰度图像
  5. img = cv2.imread('original_image.jpg')
  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  7. # Canny边缘检测
  8. edges = cv2.Canny(gray, 50, 150, apertureSize=3)

  9. # 霍夫变换检测直线
  10. lines = cv2.HoughLines(edges, 1, math.pi/180, 200)

  11. # 计算边框位置
  12. for line in lines:
  13.     rho, theta = line[0]
  14.     a = np.cos(theta)
  15.     b = np.sin(theta)
  16.     x0 = a * rho
  17.     y0 = b * rho
  18.     x1 = int(x0 + 1000 * (-b))
  19.     y1 = int(y0 + 1000 * (a))
  20.     x2 = int(x0 - 1000 * (-b))
  21.     y2 = int(y0 - 1000 * (a))

  22.     # 绘制直线
  23.     cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

  24. # 提取边框内的像素值并存储在二维列表中
  25. box = []
  26. for x in range(x1, x2):
  27.     row = []
  28.     for y in range(y1, y2):
  29.         row.append(img[y, x])
  30.     box.append(row)
复制代码


我希望这可以解决您的问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-11 14:14:47 | 显示全部楼层
这是chatGPT在互问互答吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-11 17:59:56 | 显示全部楼层
isdkz 发表于 2023-5-11 08:49
对不起,我犯了一个错误。在 OpenCV 中并没有定义 π (PI),您可以直接使用 Python 的 math 库中的 π ...

您好,还是有个报错

    for line in lines:
TypeError: 'NoneType' object is not iterable

好像是   函数返回值赋值没有 程序没看明
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-12 08:59:41 | 显示全部楼层
感激分享,认真学习。

评分

参与人数 1荣誉 -5 鱼币 -5 贡献 -3 收起 理由
歌者文明清理员 -5 -5 -3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表