Firefly开源社区

打印 上一主题 下一主题

[技术讨论] 关于ffmedia ,请问图像转发的过程中,怎么添加自己的图像处理过程

825

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
825
发表于 2024-3-7 11:20:11      楼主
可以设置输出回调函数,每个模块会处理生产者模块的数据生成对应buffer,该buffer会先经过回调函数(如果有设置回调)再输出给他的消费者模块。在回调中使用传进来的buffer 获取数据getActiveData,该接口返回的是np数组,你可以使用cv操作该数组,更改里面的内容,他的消费者模块会接收到你更改后的buffer。
回复

使用道具 举报

825

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
825
发表于 2024-3-8 11:15:22      沙发
本帖最后由 dengkx 于 2024-3-8 11:40 编辑
chenwusong 发表于 2024-3-8 10:05
大佬在么?请问回调函数怎么添加阿?可以给个代码示例吗?cpp或者python的都行,这块实在搞不定阿

将demo.py做以下更改:
diff --git a/demo/demo.py b/demo/demo.py
index 2219ba4..42a7b69 100644
--- a/demo/demo.py
+++ b/demo/demo.py
@@ -57,6 +57,9 @@ def cv2_extcall_back(obj, MediaBuffer):
         resolution = find_two_numbers(data.size//3, vb.getImagePara().hstride, vb.getImagePara().vstride)
         print("Try the recommended resolution: -o {}x{}".format(resolution[0], resolution[1]))
         exit(-1)
+
+    cv2.putText(img, 'test word', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 1, cv2.LINE_AA)
+    vb.flushDrmBuf()
     for i in range(obj.count):
         cv2.imshow(obj.name + str(i), img)
     cv2.waitKey(1)
@@ -221,9 +224,22 @@ def main():
                 print("Output image format is not 'BGR24', Use the '-b BGR24' option to specify image format.")
                 return 1
             cv_display = Cv2Display("Cv2Display", None, sync, args.cvdisplay)
-            cv_display.module = last_module.addExternalConsumer("Cv2Display", cv_display, cv2_extcall_back)
+            #cv_display.module = last_module.addExternalConsumer("Cv2Display", cv_display, cv2_extcall_back)
+            last_module.setOutputDataCallback(cv_display, cv2_extcall_back)

     if args.encodetype != -1:
+        input_para = last_module.getOutputImagePara()
+        if input_para.v4l2Fmt != m.v4l2GetFmtByName("NV12"):
+            output_para = input_para
+            output_para.v4l2Fmt = m.v4l2GetFmtByName("NV12")
+            encRga = m.ModuleRga(output_para,  m.RgaRotate(0))
+            encRga.setProductor(last_module)
+            ret = encRga.init()
+            if ret < 0:
+                print("rga init failed")
+                return 1
+            last_module = encRga
+
         enc = m.ModuleMppEnc(m.EncodeType(args.encodetype))
         enc.setProductor(last_module)
         enc.setBufferCount(8)


-----------------------------------------------------------------------
使用命令:./demo.py -i ../firefly.mp4 -b BGR24 -c 1 -s 1 -e 0 -m out.mp4
-i指向你要播放的文件或者流,cv显示并将保存文件。可以看到cv显示的画面有添加的内容,并且其他工具播放保存的out.mp4也可看到添加的内容。
demo主要更改:
1. cv回调中增加向视频帧添加文字,然后将添加的内容从cpu端刷新到dma端(flushDrmBuf)。
2. 将cv显示部分从添加外部消费者更改到rga回调里,这样cv处理后的数据就能同步输出到rga模块的消费者模块。
3. h264或h265编码需要YUV数据,添加rga模块将BGR24格式数据转成YUV数据给编码模块。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表