簡體   English   中英

如何將用枕頭修改的.png圖像添加到OpenCV視頻?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM