[英]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.