for i, rect in enumerate(sorted(rects, key=lambda x: x[1][0] * x[1][1], reverse=True)): box = cv2.boxPoints(rect) box = np.int0(box) print( f'Rank {i + 1}: Size={rect[1][0] * rect[1][1]:.0f}, Centre=({int(rect[0][0])}, {int(rect[0][1])}), Width={rect[1][0]:.0f}, Height={rect[1][1]:.0f}, Angle={rect[2]:.0f}, \nCorners={box}')改为只打印排名前三的
时间: 2023-12-09 10:03:30 浏览: 38
可以在循环中添加一个计数器变量,用来记录已经打印的矩形数量,当数量达到3时退出循环即可。修改后的代码如下:
```
count = 0
for i, rect in enumerate(sorted(rects, key=lambda x: x[1][0] * x[1][1], reverse=True)):
if count >= 3:
break
box = cv2.boxPoints(rect)
box = np.int0(box)
print(f'Rank {i + 1}: Size={rect[1][0] * rect[1][1]:.0f}, Centre=({int(rect[0][0])}, {int(rect[0][1])}), Width={rect[1][0]:.0f}, Height={rect[1][1]:.0f}, Angle={rect[2]:.0f}, \nCorners={box}')
count += 1
```
这样就只会打印排名前三的矩形信息了。
相关问题
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) img_bgr = cv2.cvtColor(imm, cv2.COLOR_GRAY2BGR) # 绘制边缘 # imm = cv2.drawContours(img_bgr, contours, -1, (0, 0, 255), 1) # 遍历轮廓 rects = [] for contour in contours: rect = cv2.minAreaRect(contour) rects.append(rect) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(img_bgr, [box], 0, (0, 0, 255), 2) for i, rect in enumerate(sorted(rects, key=lambda x: x[1][0] * x[1][1], reverse=True)): print(f'Rank {i + 1}: Size={rect[1][0] * rect[1][1]:.0f}, ({int(rect[0][0])}, {int(rect[0][1])}), Width={rect[1][0]:.0f}, Height={rect[1][1]:.0f}, Angle={rect[2]:.0f}')打印的具体是什么帮我再加上矩形轮廓的四个角的坐标
除了之前提到的矩形的信息,代码还绘制了矩形轮廓的四个角的坐标,并将其打印出来。例如,“[(45, 45), (55, 45), (55, 55), (45, 55)]”表示矩形轮廓的四个角的坐标为(45,45),(55,45),(55,55),(45,55)。下面是修改后的代码:
```
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
img_bgr = cv2.cvtColor(imm, cv2.COLOR_GRAY2BGR)
# 绘制边缘
# imm = cv2.drawContours(img_bgr, contours, -1, (0, 0, 255), 1)
# 遍历轮廓
rects = []
for contour in contours:
rect = cv2.minAreaRect(contour)
rects.append(rect)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img_bgr, [box], 0, (0, 0, 255), 2)
# 获取矩形的四个角的坐标
pts = np.int0(cv2.boxPoints(rect))
# 打印矩形的四个角的坐标
print(f'Rectangle Points: {pts.tolist()}')
for i, rect in enumerate(sorted(rects, key=lambda x: x[1][0] * x[1][1], reverse=True)):
print(f'Rank {i + 1}: Size={rect[1][0] * rect[1][1]:.0f}, ({int(rect[0][0])}, {int(rect[0][1])}), Width={rect[1][0]:.0f}, Height={rect[1][1]:.0f}, Angle={rect[2]:.0f}')
```
现有txt文件“电影信息.txt”,其中三列分别为电影名称、导演和演员表,之间用分号分隔(同一个电影可能会有多个演员,每个演员姓名之间使用逗号分隔;同一部电影也可能有多个导演,多个导演之间用逗号分隔), 使用openpyxl和matplotlab实现电影数据分析任务:导演作品统计及可视化 对电影数据中的导演信息进行统计并生成柱状图,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“导演作品统计”的sheet,统计每个导演执导的电影数量和执导电影列表。 2. 第一列填写导演姓名,第二列填写导演执导电影数量,第三列填写导演执导电影列表。如果同一导演中有多部电影,则多部电影之间以逗号(,)分隔。 3. 绘制横向柱状图,以电影数量为横坐标,以导演姓名为纵坐标。纵坐标从上到下按电影数量降序排列。 4. 在每个柱状图顶部标注出与其合作最多的演员姓名,若有多个演员,则演员名称以逗号(,)分隔。
好的,根据您的要求,我会进行编写代码。但在开始之前,我需要先确认一下您的电影信息.txt文件格式是否如下所示:
```
电影名称;导演;演员表
绿皮书;彼得·法雷里;维果·莫腾森,马赫沙拉·阿里
泰坦尼克号;詹姆斯·卡梅隆;莱昂纳多·迪卡普里奥,凯特·温丝莱特
...
```
另外,您需要安装openpyxl和matplotlib库,您可以通过以下命令进行安装:
```
pip install openpyxl matplotlib
```
确认文件格式和库已经安装后,可以将以下代码保存为.py文件并运行。
```python
from openpyxl import Workbook, load_workbook
import matplotlib.pyplot as plt
# 读取电影信息文件
with open('电影信息.txt', 'r', encoding='utf-8') as f:
movies = [line.strip().split(';') for line in f.readlines()]
# 统计导演作品数量和列表
directors = {}
for movie in movies:
movie_directors = movie[1].split(',')
for director in movie_directors:
if director not in directors:
directors[director] = {'count': 1, 'movies': [movie[0]]}
else:
directors[director]['count'] += 1
directors[director]['movies'].append(movie[0])
# 写入导演作品统计表格
wb = load_workbook('电影信息统计.xlsx')
ws = wb.create_sheet(title='导演作品统计')
ws.append(['导演姓名', '执导电影数量', '执导电影列表'])
for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True):
ws.append([director, info['count'], ','.join(info['movies'])])
wb.save('电影信息统计.xlsx')
# 绘制柱状图
counts = [info['count'] for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True)]
directors = [director for director, info in sorted(directors.items(), key=lambda x: x[1]['count'], reverse=True)]
plt.barh(directors, counts)
plt.xlabel('执导电影数量')
plt.ylabel('导演姓名')
plt.title('导演作品统计')
plt.tight_layout()
# 标注演员信息
rects = plt.gca().patches
for i, rect in enumerate(rects):
director = directors[i]
info = directors[director]
top_actor = max([(actor, movie_count) for actor, movie_count in actor_counts.items() if actor in movies and director in movies[actor]['directors']], key=lambda x: x[1])[0]
plt.text(rect.get_width() + 0.5, rect.get_y() + rect.get_height() / 2, top_actor, ha='left', va='center')
plt.show()
```
代码中,首先读取电影信息文件,然后统计每个导演执导的电影数量和执导电影列表,并将结果写入导演作品统计表格中。接着,使用matplotlib库绘制横向柱状图,并在每个柱状图顶部标注与其合作最多的演员姓名。最后,通过plt.show()显示柱状图。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)