[英]How can i add .png images modified with Pillow to an OpenCV Video?
我是新來的,我想解決一個問題,這讓我在過去的幾周里感到惡心...
這是問題所在,我有2個代碼,其中一個代碼使用OpenCV捕獲目錄的視頻(可能是網絡攝像機),並逐幀讀取每一幀的繪制文本,並繪制一個變量(僅用於測試),顯示我將視頻保存到python文件目錄中,這是代碼。...(“ MyPath”是與問題無關的文件路徑)
import cv2
import random
capture = cv2.VideoCapture(r"MyPath\Car.mp4")
out = cv2.VideoWriter('Test.avi',cv2.VideoWriter_fourcc('M','P','4','2'), 25, (1280, 720))
def velocity():
now = (random.randint(0,100))
return now
while True:
ret, frame = capture.read()
if ret:
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame,'Velocity:',(15,580),font,0.7,(255,255,255),1)
cv2.putText(frame,'Distance:',(15,620),font,0.7,(255,255,255),1)
cv2.putText(frame,'Inclination:',(15,660),font,0.7,(255,255,255),1)
cv2.putText(frame,'Orientation:',(15,700),font,0.7,(255,255,255),1)
cv2.putText(frame, str(velocity()), (130,580),font,0.7,(255,255,255),1)
cv2.putText(frame,'KM/H',(165,580),font,0.7,(255,255,255),1)
out.write(frame)
cv2.imshow("Testing", frame)
else:
break
capture.release()
out.release()
cv2.destroyAllWindows()
這可以正常工作,在這里沒有問題,我還有另一個帶有枕頭的代碼,可以打開背景圖像(jpg)和4個png圖像,它們會調整大小並重新定位它們,然后代碼將圖像粘貼到背景上方,(我只做了一個背景為了進行測試,必須將這4個png的圖像繪制到視頻幀中,但是現在它只是在測試...)然后向我展示並保存上面png的背景...同樣,它可以完美地工作!
from PIL import Image
back = Image.open(r"MyPath\Eagle.jpg")
vel = Image.open(r"MyPath\Velocímeter.png")
dis = Image.open(r"MyPath\Distance.png")
inp = Image.open(r"MyPath\Inclination.png")
orz = Image.open(r"MyPath\Orientation.png")
vel = vel.resize((60, 60), Image.LANCZOS)
dis = dis.resize((55, 55), Image.LANCZOS)
inp = inp.resize((60, 60), Image.LANCZOS)
orz = orz.resize((60, 60), Image.LANCZOS)
back.paste(vel, (10, 420), vel)
back.paste(dis, (10, 510), dis)
back.paste(inp, (10, 583), inp)
back.paste(orz, (10, 655), orz)
back.show()
back.save("Test.jpg")
問題是Pillow是一個圖像庫,所以我無法打開視頻並粘貼圖像,而OpenCV不像Pillow那樣容易接受PNG圖像...有什么方法可以將這2個代碼混合為1並做我想做的事情去做? (在視頻幀中繪制png圖像以獲取帶有文本和圖像的渲染視頻)此項目用於獲取傳感器和繪圖的信息,這就是為什么我制作了一個僅用於查看的測試功能的原因(圖像是我想要的細節添加到項目中)。 如果我的代碼喜歡您,並且對您有用,請隨時使用它! 非常感謝您的閱讀!!! 我希望您能為我提供幫助(我不會說流利的英語,對您的錯字表示抱歉,但我可以完美地閱讀您的回答)。
您可以混合使用PIL / Pillow和OpenCV。 您需要了解三件事...
要將OpenCV圖像轉換為PIL圖像:
pilimage = Image.fromarray(opencvimage)
要將PIL圖像轉換為OpenCV圖像,請執行以下操作:
opencvimage = np.array(pilimage)
最后,OpenCV以BGR順序存儲圖像,而PIL使用RGB,因此如果您不注意,紅色和藍色將被交換-cvtColor(BGR2RGB)是您的朋友。
現在我們可以將這兩段代碼混合在一起:
#!/usr/bin/env python3
import cv2
import random
import numpy as np
from PIL import Image
# Load a speedo image which has transparency
speedo = Image.open('speedo.png').convert('RGBA')
capture = cv2.VideoCapture("movie.mov")
out = cv2.VideoWriter('test.mov',cv2.VideoWriter_fourcc('a','v','c','1'), 25, (1280, 720))
def velocity():
now = (random.randint(0,100))
return now
while True:
ret, frame = capture.read()
if ret:
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame,'Velocity:',(15,580),font,0.7,(255,255,255),1)
cv2.putText(frame,'Distance:',(15,620),font,0.7,(255,255,255),1)
cv2.putText(frame,'Inclination:',(15,660),font,0.7,(255,255,255),1)
cv2.putText(frame,'Orientation:',(15,700),font,0.7,(255,255,255),1)
cv2.putText(frame, str(velocity()), (130,580),font,0.7,(255,255,255),1)
cv2.putText(frame,'KM/H',(165,580),font,0.7,(255,255,255),1)
# Make PIL image from frame, paste in speedo, revert to OpenCV frame
pilim = Image.fromarray(frame)
pilim.paste(speedo,box=(80,20),mask=speedo)
frame = np.array(pilim)
out.write(frame)
cv2.imshow("Testing", frame)
cv2.waitKey(1)
else:
break
capture.release()
out.release()
cv2.destroyAllWindows()
這是我使用的speedo:
如果您希望顏色正確地從PIL傳遞到OpenCV,則需要將通道重新排序為OpenCV期望的顏色,即BGRA。 因此,您可以將圖像加載更改為此:
# Open speedo image, split into separate RGBA channels, then re-combine in BGRA order for OpenCV
speedo = Image.open('speedo.png').convert('RGBA')
R,G,B,A = speedo.split()
speedo = Image.merge('RGBA',(B,G,R,A))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.