[英]Opencv image Processing using python
我正在从事一个图像处理项目,我试图从我的网络摄像头捕获实时图像并将其保存在指定的目标文件夹中。 当我第一次执行我的程序时,我的工作做得很好。 捕获的图像正按预期保存在给定的目的地。 但是,当我终止程序并再次运行它时,新捕获的图像被覆盖在以前的图像上,我丢失了以前的图像。 每当我运行该程序时,我都想保存我所有的图像。 请帮我解决这个问题。
这是我的代码如下:
from tkinter import image_names
import cv2
import os
import matplotlib.pyplot as plt
cap = cv2.VideoCapture(0)
img_counter = 0
for i in range(0, 2):
if cap.isOpened():
ret, frame = cap.read()
print(ret)
print(frame)
else:
ret = False
img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
plt.imshow(img1)
plt.title("Camera image 1")
img_names = "opencv_frame_{}.png".format(img_counter)
cv2.imwrite(img_names, frame)
print("Screenshot taken")
img_counter += 1
plt.xticks([])
plt.yticks([])
plt.show()
cap.release()
cv2.imwrite
的第一个参数img_names
是存储图像的文件名。 如果您在第二次启动程序时不更改它,那么第一个图像自然会被覆盖。 我建议您在那里使用动态名称,例如time.time()
from tkinter import image_names
import cv2
import os
import matplotlib.pyplot as plt
import time
cap = cv2.VideoCapture(0)
img_counter = 0
for i in range(0, 2):
if cap.isOpened():
ret, frame = cap.read()
print(ret)
print(frame)
else:
ret = False
img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
plt.imshow(img1)
plt.title("Camera image 1")
img_names = "opencv_frame_{}.png".format(time.time())
cv2.imwrite(img_names, frame)
print("Screenshot taken")
img_counter += 1
plt.xticks([])
plt.yticks([])
plt.show()
cap.release()
您真正的问题与 opencv 或图像处理无关。 您只是想避免覆盖现有文件
从你的代码中,我想做的是避免使用已经存在的 img_counter(除非你做了一些特定的事情来记住 img_counter 的先前值,方法是避免覆盖现有文件)。
例如,你可以
while True:
img_names = "opencv_frame_{}.png".format(img_counter)
if os.file.exists(img_names):
img_counter+=1
else:
break
创建 img_names。 增加 img_counter 并在它已经存在时重试(有些人不喜欢while True / break
风格,但是,好吧,我经常使用它)
这种方法的缺点是它会填充文件列表中的潜在“漏洞”(如果您的驱动器包含帧 0 到 10000,然后是 10002 到 100000,那么新的运行将写入文件 10001,然后是 100001、100002,...可能不需要。另外,这意味着在抓取过程中,您会发现自己迭代 90000 个文件名以找到下一个“洞”)
所以你也可以保存一个文件来调用 img_counter 从一次运行到另一次使用
with open('img_counter.txt', 'w') as f:
f.write(f"{img_counter}")
在代码末尾保存 img_counter 并
with open('img_counter.txt') as f:
img_counter=int(f.read())
回忆起它的开头。
但是,您需要确保每次都执行“写入”部分。 程序突然结束就不会这样了(极端例子:掉电了)
在reda的解决方案之后编辑:
确实,您从未说过您只希望所有名称都严格采用opencv_frame_number.png
形式
因此,您也可以按照 reda 的建议简单地用时间戳替换帧号。 或者,中间方案,使用timestamp作为前缀,然后在frame_number内
在代码的开头,您可以计算一个前缀
prefix=time.time()
然后,您的 img_names 可能是
img_names = f"opencv_frame_{prefix}_{img_counter}.png"
(我没有真正正当的理由用 f-string 替换了 your.format(...) 。只是,我觉得很多人不知道 f-string 存在,更容易使用,更快。但是在这里,在保存图像所需的时间之前,所有这些都可以忽略不计)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.