質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

3864閲覧

rtspで入力された画像をOpencvで処理してrtspで配信したい

kokawa2003

総合スコア217

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/05 12:40

編集2022/05/05 12:50

rtspで入力された画像をOpencvで処理してrtspで配信したいと思いました。
探すと
https://stackoverflow.com/questions/47396372/write-opencv-frames-into-gstreamer-rtsp-server-pipeline?rq=1
が見つかりました。
でこれを改造して

python

1 2# see: https://stackoverflow.com/questions/47396372/write-opencv-frames-into-gstreamer-rtsp-server-pipeline?rq=1 3class SensorFactory(GstRtspServer.RTSPMediaFactory): 4 isOpen=False 5 6 def __init__(self, **properties): 7 super(SensorFactory, self).__init__(**properties) 8 self.mymidas=myMidas() 9 IPD = 6.5 10 MONITOR_W = 38.5 11 self.pos = int(IPD*MONITOR_W) 12 url=sys.argv[1] 13 14 self.cap = cv2.VideoCapture(url) 15 while True: 16 if self.cap.isOpened() is True : 17 print("IS open") 18 break 19 else: 20 print("NOT open") 21 time.sleep(1) 22 self.cap.open(url) 23 24 self.w = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 25 self.h = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 26 fps = int(self.cap.get(cv2.CAP_PROP_FPS)) 27 n_frames = (self.cap.get(cv2.CAP_PROP_FRAME_COUNT)) 28 print(str(self.w)+":"+str(self.h)+":"+str(fps)+":"+str(n_frames)) 29 self.number_frames = 0 30 self.fps = fps 31 self.duration = 1 / self.fps * Gst.SECOND # duration of a frame in nanoseconds 32 self.launch_string = "appsrc name=source is-live=true block=true format=GST_FORMAT_TIME " \ 33 "caps=video/x-raw,format=BGR,width="+str(self.w)+",height="+str(self.h)+",framerate={}/1 " \ 34 "! videoconvert ! video/x-raw,format=I420 " \ 35 "! x264enc threads=8 pass=qual key-int-max=5 dct8x8=true " \ 36 "! rtph264pay config-interval=1 name=pay0 pt=96".format(self.fps) 37 #self.cap.release() 38 #self.cap= cv2.cudacodec.createVideoReader(url) 39 self.isOpen=True 40 41 @jit 42 def sendmain(self,frame,src): 43 frame=self.mymidas.cnv(frame,self.pos) 44 #cv2.imwrite("test.png",frame2) 45 data = frame.tostring() 46 buf = Gst.Buffer.new_allocate(None, len(data), None) 47 buf.fill(0, data) 48 buf.duration = self.duration 49 timestamp = self.number_frames * self.duration 50 buf.pts = buf.dts = int(timestamp) 51 buf.offset = timestamp 52 self.number_frames += 1 53 retval = src.emit('push-buffer', buf) 54 #print('pushed buffer, frame {}, duration {} ns, durations {} s'.format(self.number_frames, 55 # self.duration, 56 # self.duration / Gst.SECOND)) 57 if retval != Gst.FlowReturn.OK: 58 print(retval) 59 60 def sendcore(self,frame,src): 61 try: 62 #print("S") 63 self.sendmain(frame,src) 64 #print("E") 65 except: 66 print("myexcept") 67 68 @jit 69 def on_need_data(self, src, lenght): 70 if self.isOpen: 71 ret, frame = self.cap.read() 72 if ret: 73 self.sendcore(frame,src) 74 75 @jit 76 def do_create_element(self, url): 77 return Gst.parse_launch(self.launch_string) 78 @jit 79 def do_configure(self, rtsp_media): 80 self.number_frames = 0 81 appsrc = rtsp_media.get_element().get_child_by_name('source') 82 appsrc.connect('need-data', self.on_need_data) 83 84 85class GstServer(GstRtspServer.RTSPServer): 86 nPort=8555 87 88 def __init__(self, **properties): 89 super(GstServer, self).__init__(**properties) 90 self.factory = SensorFactory() 91 self.set_service(str(self.nPort)) 92 self.factory.set_shared(True) 93 self.get_mount_points().add_factory("/test", self.factory) 94 self.attach(None) 95 96 97#GObject.threads_init() 98Gst.init(None) 99 100server = GstServer() 101 102s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 103s.connect(("8.8.8.8", 80)) 104ip=s.getsockname()[0] 105strurl="rtsp://"+ip+":"+str(server.nPort)+"/test" 106 107print("server start:"+strurl) 108loop = GLib.MainLoop() 109loop.run()

を作りました。いい感じで動きますが問題は出力される画像の画質が悪いことです。
この出力画像をffplayで見ると
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 29 fps, 29 tbr, 90k tbn, 58 tbc
みたいな感じになりprofileがConstrained BaselineでHighになりません。
gstreamer のx264encnoのhelpをみていろいろやって見たが良くなりません。
dct8x8=trueで解決すると聞いたのでやったがだめでした
一体どうすればいいのでしょうか?
イメージ説明
特に画面が切り替わるときこうなることがありこれだけでも取れればいいのですが、
これはどのパラメータによるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2022/05/05 14:16

profleをHIGHにするのは "! x264enc  ...." \ "! video/x-h264,profile=high "\ で解決したがゴマ塩ノイズは取れませんでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問