鱼C论坛

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

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

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

处理后
11.jpg


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

感激!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

下面是Python代码示例:
import cv2# 读取原始图像并转换为灰度图像img = cv2.imread('original_image.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Canny边缘检测edges = cv2.Canny(gray, 50, 150, apertureSize=3)# 霍夫变换检测直线lines = cv2.HoughLines(edges, 1, cv2.cv2.PI/180, 200)# 计算边框位置for line in lines:    rho, theta = line[0]    a = np.cos(theta)    b = np.sin(theta)    x0 = a * rho    y0 = b * rho    x1 = int(x0 + 1000 * (-b))    y1 = int(y0 + 1000 * (a))    x2 = int(x0 - 1000 * (-b))    y2 = int(y0 - 1000 * (a))    # 绘制直线    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)# 提取边框内的像素值并存储在二维列表中box = []for x in range(x1, x2):    row = []    for y in range(y1, y2):        row.append(img[y, x])    box.append(row)
其中, original_image.jpg 是原始图像的文件名。 x1 、 y1 、 x2 、 y2 是边框的位置。 box 是存储像素值的二维列表。您需要根据实际情况调整参数以获得最佳结果。
想知道小甲鱼最近在做啥?请访问 -> 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'
想知道小甲鱼最近在做啥?请访问 -> 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 。

请看下面的修正后的代码:
import cv2
import numpy as np
import math

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

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

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

# 计算边框位置
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))

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

# 提取边框内的像素值并存储在二维列表中
box = []
for x in range(x1, x2):
    row = []
    for y in range(y1, y2):
        row.append(img[y, x])
    box.append(row)

我希望这可以解决您的问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-11 14:14:47 | 显示全部楼层
这是chatGPT在互问互答吗
想知道小甲鱼最近在做啥?请访问 -> 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

好像是   函数返回值赋值没有 程序没看明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 03:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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