ã¯ããã«
IBEXããã°ã§ã¯å ããã¦GStreamerã«é¢ããè¨äºãæ²è¼ããã¦ããã ãã¦ãã¾ãããä»åã®ããã°å 容ã¯GStreamerã®å¿ç¨ç·¨ã¨ãªãã¾ããGStreameré£è¼è¨äºã¨ä½µãã¦èªãã§ããã ããã¨å¹¸ãã§ããGStreamerã¯å¤ç¨®å¤æ§ãªã¨ã¬ã¡ã³ããç¨æããã¦ããæ§ã ãªãã«ãã¡ãã£ã¢ã®å¦çãå¯è½ã§ãããæ¢åã®ã¨ã¬ã¡ã³ãã ãã§ã¯å®ç¾ã§ããªããããªã¢ããªã±ã¼ã·ã§ã³ã使ãããå ´åãã¦ã¼ã¶ç¬èªã®æ©è½ãå®è£ ããå¿ è¦ãããã¾ãããã®æ¹æ³ã¯è²ã ã¨ããã¾ãããããã§ã¯gst-pythonãåãä¸ãããã¨æãã¾ãããã®ããã°ã§ã¯gst-pythonã®æ¦è¦èª¬æã¨ç°¡åãªgst-pythonãç¨ãããµã³ãã«ãã¢ãåããã¦ã¿ã¾ãã
gst-pythonã¨ã¯
gst-pythonã¯GStreamerãPythonã§ä½¿ç¨ããããã®ãã¤ã³ãã£ã³ã°ã§ããã¤ã³ã¹ãã¼ã«æ¸ã¿ã§ããGStreamerã®ãã©ã°ã¤ã³ãã¨ã¬ã¡ã³ãããã®ã¾ã¾Pythonã§ä½¿ç¨ã§ããããã«ãªãã¾ããã¾ãPythonã¹ã¯ãªããããGStreamerã®ãã¤ãã©ã¤ã³ãæ§ç¯ãããããã¤ãã©ã¤ã³ãæµãããã¼ã¿ã¸ã®ã¢ã¯ã»ã¹ããããããã¨ãå¯è½ã¨ãªãã¾ããPythonã使ããããã«ãªãã¡ãªããã¯ä½ã¨ãã£ã¦ãè±å¯ãªã©ã¤ãã©ãªã使ç¨ã§ããããã«ãªããã¨ã§ããGStreamerã¨Pythonãèåãããã¨ã§ãå®ç¾ã§ããã¢ããªã±ã¼ã·ã§ã³ã®å¯è½æ§ãåºããã¾ãã
gst-pythonã使ç¨ããããã®ç°å¢æ§ç¯
gst-pythonã使ç¨ããããã«ãã¾ãã¯GStreamerã®ã¤ã³ã¹ãã¼ã«ããè¡ãã¾ããGStreamer ã使ããï¼ ãã®1 ï½GStreamer ã®ä¸çã¸ããããç·¨ï½ãåèã«ã¤ã³ã¹ãã¼ã«ãè¡ãã¾ããUbuntuã®å ´åã¯ä»¥ä¸ã®ã³ãã³ãã«ãªãã¾ãã
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
次ã«python3-giã®ã¤ã³ã¹ãã¼ã«ãè¡ãã¾ãããã®ã¤ã³ã¹ãã¼ã«ãè¡ããã¨ã§GObjectãã¼ã¹ã®ã©ã¤ãã©ãªãPythonãã使ç¨ã§ããããã«ãªãã¾ããç°å¢æ§ç¯ã¯ä»¥ä¸ã§ãã
sudo apt install python3-gi
gst-pythonãç¨ãããµã³ãã«ãåããããã®ç°å¢æ§ç¯
OpenCVã®ã¤ã³ã¹ãã¼ã«
æ©éã§ãããgst-pythonãåããã¦ã¿ããã¨æãã¾ããä»ååä½ç¢ºèªç¨ã®ã½ã¼ã¹ã³ã¼ããç¨æãã¾ããããã®ã³ã¼ãã§ã¯OpenCVã使ç¨ãããããã³ã¼ãå®è¡åã«ã©ã¤ãã©ãªã®ã¤ã³ã¹ãã¼ã«ãè¡ãã¾ãã
pip3 install opencv-python
ä»ååä½ç¢ºèªãè¡ã£ãç°å¢ã¯Ubuntu20.04ã§Pythonã®ãã¼ã¸ã§ã³ã¯3.8.10ã§ããã©ã¤ãã©ãªã®ãã¼ã¸ã§ã³ã¯ä»¥ä¸ã§åä½ç¢ºèªãè¡ãã¾ããã
Package Version
------------- ---------
dbus-python 1.2.16
numpy 1.24.4
opencv-python 4.10.0.84
pip 20.0.2
PyGObject 3.36.0
setuptools 45.2.0
wheel 0.34.2
ã³ã¼ãã®ç¨æ
ä»åå®è¡ããã³ã¼ãã§ãã詳細ã¯å¾è¿°ãã¾ãã
ã½ã¼ã¹ã³ã¼ã
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib
import numpy as np
import cv2
# åæå
Gst.init(None)
# ãã©ã¡ã¼ã¿
WIDTH = 640
HEIGHT = 480
FRAMERATE = "10/1"
OUTFILE_NAME = "output.mp4"
# ãã¹ã¡ãã»ã¼ã¸ãåä¿¡ããéã®å¦ç
def handle_bus_messages(bus, message, loop, src):
t = message.type
src_name = message.src.get_name()
if t == Gst.MessageType.EOS:
print(f"{src_name} received End-Of-Stream")
if src_name == "input_pipeline":
src.emit('end-of-stream')
elif src_name == "output_pipeline":
loop.quit()
# ãã¬ã¼ã å å·¥
def frame_processing(frame):
frame_blur = cv2.GaussianBlur(frame, (15, 15), 0)
return frame_blur
# ãã¤ãã©ã¤ã³ããæ åãã¬ã¼ã ãåä¿¡ããéã®å¦ç
def on_new_sample(sink, src):
sample = sink.emit('pull-sample')
inp_buf = sample.get_buffer()
result, map_info = inp_buf.map(Gst.MapFlags.READ)
if result:
# æ åãã¬ã¼ã åå¾
frame_bgr = np.ndarray(shape=(HEIGHT, WIDTH, 3), dtype=np.uint8, buffer=map_info.data)
# ãã¬ã¼ã å å·¥
frame_proc = frame_processing(frame_bgr)
# output_pipelineã«å å·¥ããæ åãã¬ã¼ã ãããã·ã¥
frame_i420 = cv2.cvtColor(frame_proc, cv2.COLOR_BGR2YUV_I420)
out_buf = Gst.Buffer.new_wrapped(frame_i420.tobytes())
out_buf.pts = inp_buf.pts
out_buf.duration = inp_buf.duration
out_buf.dts = inp_buf.dts
src.emit('push-buffer', out_buf)
inp_buf.unmap(map_info)
return Gst.FlowReturn.OK
if __name__ == '__main__':
# ã¡ã¤ã³ã«ã¼ãã®è¨å®
loop = GLib.MainLoop()
# GStreamerã®ãã¤ãã©ã¤ã³ã使
input_pipeline = Gst.parse_launch(
f"videotestsrc num-buffers=100 ! videoconvert ! video/x-raw,format=BGR,width={WIDTH},height={HEIGHT}, framerate={FRAMERATE} ! appsink name=sink"
)
input_pipeline.set_name("input_pipeline")
output_pipeline = Gst.parse_launch(
f"appsrc name=src ! video/x-raw,format=I420, width={WIDTH}, height={HEIGHT}, framerate={FRAMERATE} ! x264enc ! h264parse ! mp4mux ! filesink location={OUTFILE_NAME}"
)
output_pipeline.set_name("output_pipeline")
# output_pipelineã®appsrcã®è¨å®
src = output_pipeline.get_by_name("src")
# input_pipelineã®appsinkã®è¨å®
sink = input_pipeline.get_by_name("sink")
sink.set_property("emit-signals", True)
sink.connect("new-sample", on_new_sample, src)
# ãã¹ã®è¨å®
input_pipeline_bus = input_pipeline.get_bus()
input_pipeline_bus.add_signal_watch()
input_pipeline_bus.connect("message", handle_bus_messages, loop, src)
output_pipeline_bus = output_pipeline.get_bus()
output_pipeline_bus.add_signal_watch()
output_pipeline_bus.connect("message", handle_bus_messages, loop, src)
# ãã¤ãã©ã¤ã³ãéå§
input_pipeline.set_state(Gst.State.PLAYING)
output_pipeline.set_state(Gst.State.PLAYING)
try:
loop.run()
except KeyboardInterrupt:
pass
# ãã¤ãã©ã¤ã³ã忢
input_pipeline.set_state(Gst.State.NULL)
output_pipeline.set_state(Gst.State.NULL)
ã³ã¼ãã®æ¦è¦
ç¨æããã³ã¼ãã®æ¦è¦ã説æãã¾ããvideotestsrcã¨ã¬ã¡ã³ãã§çæãããã¹ãæ åã«å¯¾ãã¦ãæ åå¦çã©ã¤ãã©ãªã§ããOpenCVã使ç¨ãã¦Pythonã§æ åå å·¥ãããã®ãMP4ãã¡ã¤ã«ã§ä¿åããã¨ãã£ãåä½ãã¢ã«ãªãã¾ããGStreamerãã¤ãã©ã¤ã³ã¯æ åå
¥åå´ï¼input_pipelineï¼ã¨æ ååºåå´ï¼output_pipelineï¼ã®2æ¬åå¨ãã¦ãã¾ãããããã®ãã¤ãã©ã¤ã³ã«æã¾ããå½¢ã§Pythonã§æ åãã¬ã¼ã ã®å å·¥ãè¡ã颿°ãåå¨ãã¦ããã¨ããæ§æã«ãªãã¾ããä»åãã¬ã¼ã å å·¥ã§ã¯ãã©ã¼å¦çã¨æåæ¿å
¥ãè¡ã£ã¦ã¿ã¾ããã

ã©ã¤ãã©ãªã®ã¤ã³ãã¼ã
ããããã¯ä¸»è¦é¨åã®ã³ã¼ãã解説ãã¦ããã¾ãã
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib
ä¸è¨ã®ã³ã¼ãã§Pythonä¸ã§GStreamerã使ãããã®ã©ã¤ãã©ãªãimportãã¦ãã¾ããGstã¢ã¸ã¥ã¼ã«ã¯GStreamerã®ãã¤ã³ãã£ã³ã°ãæä¾ããã¢ã¸ã¥ã¼ã«ã§ãGLibã¢ã¸ã¥ã¼ã«ã¯GLibã©ã¤ãã©ãªã®ãã¤ã³ãã£ã³ã°ãæä¾ããã¢ã¸ã¥ã¼ã«ã§ãããããã®ã¢ã¸ã¥ã¼ã«ã使ç¨ãã¦ãã¤ãã©ã¤ã³ã®ä½æãã¡ã¤ã³ã«ã¼ãã®ç®¡çãè¡ãGStreamerã®æ©è½ãPythonã§ä½¿ç¨ãã¦ããã¾ãã
åæå
# åæå
Gst.init(None)
Gstã¢ã¸ã¥ã¼ã«ã®åæåãè¡ã颿°ã§ããã¢ããªã±ã¼ã·ã§ã³ã®å®è¡åã«å¿ ãè¡ãå¿ è¦ãããã¾ããã³ãã³ãã©ã¤ã³å¼æ°ãæå®ãããã¨ãå¯è½ã§ããããã®ã³ã¼ãã§ã¯Noneãæå®ãã¦ãã¾ãã
ãã¤ãã©ã¤ã³ã®æ§ç¯
input_pipeline = Gst.parse_launch(
f"videotestsrc num-buffers=100 ! videoconvert ! video/x-raw,format=BGR,width={WIDTH},height={HEIGHT}, framerate={FRAMERATE} ! appsink name=sink"
)
input_pipeline.set_name("input_pipeline")
å
¥åå´ã®ãã¤ãã©ã¤ã³ãæ§ç¯ãã¦ãã¾ããvideotestsrcã§æ åã®æ¨ªå¹
=640ãã¯ã»ã«ãé«ã=480ãã¯ã»ã«ããã¬ã¼ã ã¬ã¼ã=10fpsã§åè¨100æã®ãã¬ã¼ã ã®æ åï¼10ç§ï¼ãçæãã¾ããçæããæ åãã©ã¼ãããã¯BGRã§ããappsinkã¯GStreamerãã¤ãã©ã¤ã³ãããã¼ã¿ãåå¾ãããã¨ãã§ããã¨ã¬ã¡ã³ãã§ãããã®ã¨ã¬ã¡ã³ããç¹ãåããããã¨ã§videotestsrcã§çæããæ åãåå¾ããPythonã§æ åãã¼ã¿ãç´æ¥æä½ãããã¨ãå¯è½ã«ãªãã¾ãããã®ãã¤ãã©ã¤ã³ã®ååã¯input_pipelineã¨ãã¦ãã¾ãã
output_pipeline = Gst.parse_launch(
f"appsrc name=src ! video/x-raw,format=I420, width={WIDTH}, height={HEIGHT}, framerate={FRAMERATE} ! x264enc ! h264parse ! mp4mux ! filesink location={OUTFILE_NAME}"
)
output_pipeline.set_name("output_pipeline")
åºåå´ã®ãã¤ãã©ã¤ã³ãæ§ç¯ãã¦ãã¾ããappsrcã¯GStreamerãã¤ãã©ã¤ã³ã«ãã¼ã¿ãæ¿å
¥ãããã¨ãã§ããã¨ã¬ã¡ã³ãã§ããPythonã§æ åå å·¥ãããã¬ã¼ã ãæ¿å
¥ãããã¨ãå¯è½ã«ãªãã¾ãããã¬ã¼ã ã®ãµã¤ãºããã¬ã¼ã ã¬ã¼ãã¯å
¥åã¨åãã§ãæ åãã©ã¼ãããã¯I420ã¨ãã¦ãã¾ããx264encã¯æµãã¦ããæ åãH.264ã§ã¨ã³ã³ã¼ãããã¨ã¬ã¡ã³ãã§ããI420ã§åºåãã¦ããã®ã¯ããããx264encã®åãä»ãããã©ã¼ãããã®ã²ã¨ã¤ã ããã§ããx264encã¯H.264ã½ããã¦ã§ã¢ã¨ã³ã³ã¼ãã®x264ãå©ç¨ãã¾ããh264parseã¯H.264ã¹ããªã¼ã ãè§£æããå¤éåã§ãããããã±ããã調æ´ãã¾ããmp4muxã¯MP4ã³ã³ããã«æ åã¹ããªã¼ã ãå¤éåãã¾ããæå¾ã«å¤éåããããã¼ã¿ãfilesinkã§ãã¡ã¤ã«ã«æ¸ãåºãã¾ãããã¡ã¤ã«åã¯location=output.mp4ã§ãããã®ãã¤ãã©ã¤ã³ã®ååã¯output_pipelineã¨ãã¦ãã¾ãã
æ åãã¬ã¼ã åå¾->å å·¥->æ¿å ¥ã¾ã§ã®å®è£
# input_pipelineã®appsinkã®è¨å®
sink = input_pipeline.get_by_name("sink")
sink.set_property("emit-signals", True)
sink.connect("new-sample", on_new_sample, src)
input_pipelineã®appsinkããæ åãã¬ã¼ã ãåå¾ã§ãããããªè¨å®ãè¡ã£ã¦ãã¾ããemit-signalsã¨ããããããã£ãTrueã«è¨å®ãããã¨ã«ãã£ã¦appsinkãæ°ãããµã³ãã«ãã¼ã¿ï¼æ åãã¬ã¼ã ï¼ãåãåã£ãéã«ânew-sampleâã¨ããã·ã°ãã«ãçºè¡ãããããã«ãªãã¾ããânew-sampleâãçºè¡ãããéã«ã¯on_new_sampleã¨ããã³ã¼ã«ããã¯é¢æ°ãå¼ã°ããããã«è¨å®ãã¦ãã¾ãã
# ãã¬ã¼ã å å·¥
def frame_processing(frame):
frame_blur = cv2.GaussianBlur(frame, (15, 15), 0)
return frame_blur
# ãã¤ãã©ã¤ã³ããæ åãã¬ã¼ã ãåä¿¡ããéã®å¦ç
def on_new_sample(sink, src):
sample = sink.emit('pull-sample')
inp_buf = sample.get_buffer()
result, map_info = inp_buf.map(Gst.MapFlags.READ)
if result:
# æ åãã¬ã¼ã åå¾
frame_bgr = np.ndarray(shape=(HEIGHT, WIDTH, 3), dtype=np.uint8, buffer=map_info.data)
# ãã¬ã¼ã å å·¥
frame_proc = frame_processing(frame_bgr)
# output_pipelineã«å å·¥ããæ åãã¬ã¼ã ãããã·ã¥
frame_i420 = cv2.cvtColor(frame_proc, cv2.COLOR_BGR2YUV_I420)
out_buf = Gst.Buffer.new_wrapped(frame_i420.tobytes())
out_buf.pts = inp_buf.pts
out_buf.duration = inp_buf.duration
out_buf.dts = inp_buf.dts
src.emit('push-buffer', out_buf)
inp_buf.unmap(map_info)
return Gst.FlowReturn.OK
on_new_sample颿°ã§ã¯appsinkããã®æ åãã¬ã¼ã åå¾ããã¬ã¼ã ã®å å·¥å¦çãå å·¥å¾ã®æ åãã¬ã¼ã ãoutput_pipelineã®appsrcã«æ¿å
¥ãè¡ã£ã¦ãã¾ããããã§ã¯numpyå½¢å¼ã§æ åãã¬ã¼ã ãåå¾ãããã¬ã¼ã ã®å å·¥ã¯OpenCVã®GaussianBlur颿°ãç¨ãã¦ãã©ã¼å¦çãè¡ã£ã¦ãã¾ããå å·¥å¾ã®ãã¬ã¼ã ã¯I420ãã©ã¼ãããã«å¤æãããå¾ãappsrcã«æ¿å
¥ããã¾ããframe_processing颿°ã®ä¸èº«ãèªç±ã«å¤ãããã¨ã§ä»»æã®ç»åå¦çãå¯è½ã«ãªãã¾ãã
ãã¤ãã©ã¤ã³ã®ãã¹è¨å®
# ãã¹ã®è¨å®
input_pipeline_bus = input_pipeline.get_bus()
input_pipeline_bus.add_signal_watch()
input_pipeline_bus.connect("message", handle_bus_messages, loop, src)
output_pipeline_bus = output_pipeline.get_bus()
output_pipeline_bus.add_signal_watch()
output_pipeline_bus.connect("message", handle_bus_messages, loop, src)
GStreamerã®ãã¤ãã©ã¤ã³ã®åã¨ã¬ã¡ã³ãã¯ãã¹ã«æ¥ç¶ããã¦ããããã¤ãã©ã¤ã³å
ã§çºçããã¤ãã³ããã¡ãã»ã¼ã¸ããã¹ãä»ãã¦éç¥ããã¾ããä¸è¨ã®ã³ã¼ãã§ã¯ãããã¾ã§ã§ä½æãããã¤ãã©ã¤ã³ã®ãã¹ã®è¨å®ãè¡ã£ã¦ãã¾ããinput_pipelineã¨output_pipelineã§ã¯ãã¤ãã©ã¤ã³ããã¡ãã»ã¼ã¸ãçºè¡ãããã¨handle_bus_messagesã¨ããã³ã¼ã«ããã¯é¢æ°ãå¼ã°ããããã«è¨å®ãã¦ãã¾ãã
# ãã¹ã¡ãã»ã¼ã¸ãåä¿¡ããéã®å¦ç
def handle_bus_messages(bus, message, loop, src):
t = message.type
src_name = message.src.get_name()
if t == Gst.MessageType.EOS:
print(f"{src_name} received End-Of-Stream")
if src_name == "input_pipeline":
src.emit('end-of-stream')
elif src_name == "output_pipeline":
loop.quit()
handle_bus_messages颿°ã®å¦çå
容ã§ããinput_pipelineã§Gst.MessageType.EOSã¨ããã¡ãã»ã¼ã¸ï¼æ åã®çµäºã示ãï¼ãéç¥ãããéã«output_pipelineã®appsrcã«å¯¾ãâend-of-streamâãçºè¡ããæ åãçµäºããæ¨ãä¼ãã¦ãã¾ããoutput_pipelineã§Gst.MessageType.EOSãéç¥ãããã¨ã¡ã¤ã³ã«ã¼ããçµäºããããã«ãã¦ãã¾ãã
ãã¤ãã©ã¤ã³ã®å¶å¾¡
# ã¡ã¤ã³ã«ã¼ãã®è¨å®
loop = GLib.MainLoop()
<çç¥>
# ãã¤ãã©ã¤ã³ãéå§
input_pipeline.set_state(Gst.State.PLAYING)
output_pipeline.set_state(Gst.State.PLAYING)
try:
loop.run()
except KeyboardInterrupt:
pass
# ãã¤ãã©ã¤ã³ã忢
input_pipeline.set_state(Gst.State.NULL)
output_pipeline.set_state(Gst.State.NULL)
ä¸è¨ã®ã³ã¼ãã§GStreamerãã¤ãã©ã¤ã³ã®éå§ã¨åæ¢ãè¡ã£ã¦ãã¾ããGStreamerãã¤ãã©ã¤ã³ã«ã¯ã¹ãã¼ããããããã¤ãã©ã¤ã³ãPLAYINGã«ã»ãããããã¨ã§ãã¤ãã©ã¤ã³å ã®ã¨ã¬ã¡ã³ããå¦çãéå§ããã¤ãã©ã¤ã³ä¸ããã¼ã¿ãæµãå§ãã¾ããloop.run()ã§ã¡ã¤ã³ã«ã¼ããå®è¡ãããã«ã¼ããå®è¡ããã¦ããéã¯ãã¤ãã©ã¤ã³ã¯å¦çãç¶ç¶ãã¾ããã«ã¼ããçµäºããã¨ã¹ãã¼ããNULLã«ã»ããããã¤ãã©ã¤ã³ãåæç¶æ ã«æ»ãã¾ãã
ã³ã¼ãå®è¡ï¼ãã©ã¼å¦çï¼
以ä¸ã®æ åã¯ä½ããã¬ã¼ã å å·¥ããªãå ´åã®frame_processingã®ä¾ã¨ãã¹ãæ åã§ãã
def frame_processing(frame):
return frame
ããã«å¯¾ããã¬ã¼ã å å·¥ã¨ãã¦ãã©ã¼å¦çãè¡ã£ãå ´åã®ã³ã¼ãã¨æ åã以ä¸ã§ããåã«ã©ã¼ã®å¢çãå³ä¸ã®ç åµãã¼ãããæ åãä½ããã¨ãã§ãã¾ããã
# ãã¬ã¼ã å å·¥
def frame_processing(frame):
frame_blur = cv2.GaussianBlur(frame, (15, 15), 0)
return frame_blur
ã³ã¼ãå®è¡ï¼æåãæ¿å ¥ï¼
ãã®ã³ã¼ãã¯frame_processing颿°ãèªç±ã«å¤æ´ãããã¨ã§æ§ã
ãªãã¬ã¼ã å å·¥ãè¡ããã¨ãã§ãã¾ããæ¬¡ã¯è©¦ãã«frame_processing颿°ã以ä¸ã®ã³ã¼ãã«å¤æ´ãã¦å®è¡ãã¦ã¿ã¾ããâIBEXâã¨ããæåã䏿åãã¤æ åã«è¡¨ç¤ºããå å·¥ãè¡ãããã«å¤æ´ãã¾ããããªãappsinkããåå¾ãããã¬ã¼ã ã¯èªã¿åãå°ç¨ãªã®ã§frame.copy()ã§è¤è£½ãã¦ãã¬ã¼ã å å·¥ãè¡ã£ã¦ãã¾ãã
# ãã¬ã¼ã å å·¥
def frame_processing(frame):
frame_text = frame.copy()
cv2.putText(frame_text, text='I', org=(0, int(HEIGHT/2)), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=3, color=(255, 0, 0), thickness=5)
cv2.putText(frame_text, text='B', org=(int(WIDTH/4), int(HEIGHT/2)), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=3, color=(0, 0, 255), thickness=5)
cv2.putText(frame_text, text='E', org=(int(WIDTH/2), int(HEIGHT/2)), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=3, color=(255, 0, 0), thickness=5)
cv2.putText(frame_text, text='X', org=(int(WIDTH*3/4), int(HEIGHT/2)), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=3, color=(255, 0, 0), thickness=5)
return frame_text
ãã®ã³ã¼ããå®è¡ããéã«åºåãããæ åã以ä¸ã«ãªãã¾ããã¡ããã¨âIBEXâã¨ããæåã表示ããã¾ããã
ãããã«
ä»åã説æããã¦ããã ããå®è£ ä¾ã¯ç°¡æçãªãã®ã§ããããGStreamerã®ã¨ã¬ã¡ã³ããvideotestsrcããfilesrcãrtspsrcçã«å¤æ´ããã°ä»»æã®å ¥åæ åã«ã対å¿å¯è½ã«ãªãã¾ããã¾ãæ åè§£æç¨éã¨ãã¦AIå¦çã¨ã®çµã¿åãããå¯è½ã«ãªãã¾ããå®éã«å¼ç¤¾ã§ã¯gst-pythonãç¨ãã¦æ§ã ãªã·ã¹ãã ãæ§ç¯ãã¦ãã¾ããä»å¾ãgst-pythonãæ´»ç¨ããæ åå¦çã®å¯è½æ§ã模索ãã¦ããããã¨æãã¾ãã