目录

  • 问题
  • 解决方案
    • 步骤一:生成中文图片
    • 步骤二:中文图片蒙皮到视频帧,形成中文显示效果

问题

在jetson nano这样的嵌入式设备上,用opencv拉流,并在实时视频上面,显示汉字。

关于使用opencv/c++显示中文,网上文章分为两种:

  1. 使用freetype库+cv::putText()函数。该种方法仅适用于windows!
  2. 使用嵌入式Qt做中文显示。这是嵌入式设备做图形显示的正途,包括展现实时视频等,最好都用Qt做。

本人没有学过qt,因此找到一种取巧的办法,在win上生成中文图片,再将该图片蒙皮到视频帧,形成视频上有中文的效果。

解决方案

步骤一:生成中文图片

在windows上打开ppt,创建空白页面,选择“插入”–>“文本框”,选择“横排文本框”,创建一个文本框,里面填入你需要的中文。

将文本框的背景设置为白色,字体设置为红色(后面展示的字体就是红色的)。然后右键文本框,将该文本框保存为hanzi.png图片。

其中,需要注意的是,

  • 建议选择较为粗壮的字体,如“华文琥珀”等。
  • 框体不宜过大。

我的如图

文本框另存为hanzi.png。

步骤二:中文图片蒙皮到视频帧,形成中文显示效果

蒙皮简易代码参考博客:《opencv3/C++视频中叠加透明图片的实现》

  • 创建测试项目test_rtsp
mkdir ~/test_rtsp
cd test_rtsp

将上述文本框图片hanzi.png复制到该项目目录下。

  • c++源码

在项目目录test_rtsp下创建 CMakeLists.txt 和 test_rtsp.cpp,

touch CMakeLists.txt
touch test_rtsp.cpp

在CMakeLists.txt中添加如下内容:

cmake_minimum_required(VERSION 2.12)
project(DisplayRTSP)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")add_executable(test_rtsp test_rtsp.cpp)
target_link_libraries(test_rtsp ${OpenCV_LIBS})

在test_rtsp.cpp中添加如下内容:

// video_test.cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <string>
#include <vector>
#include <stdlib.h>
#include "time.h"static std::mutex mut;
static std::atomic_bool isOpen;
using namespace cv;
using namespace std;static void frame_get(cv::Mat* pFrame, const std::string& adm, const std::string& pwd, const std::string& ip)
{cv::VideoCapture capture("rtsp://"+adm+":"+pwd+"@"+ip);if (!capture.isOpened()) {std::cout << "------reconnecting---------" << ip << std::endl;isOpen = false;}cv::Mat frame;while (isOpen) {capture >> frame;if (mut.try_lock()) {frame.copyTo(*pFrame);mut.unlock();}cv::waitKey(5);}capture.release();
}int main(int argc, char* argv[])
{cv::setNumThreads(1);isOpen = true;cv::Mat frame, temp_frame;// 填入摄像头账号,我的为adminstd::string adm = "admin";//填入摄像头密码,std::string pwd = "xxx";//填入摄像头ipstd::string ip = "192.168.20.22";std::thread t(frame_get, &frame, adm, pwd, ip);//视频窗口设置cv::namedWindow(ip, cv::WINDOW_NORMAL);//cv::setWindowProperty(ip, cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN);cv::moveWindow(ip, 10, 10);cv::resizeWindow(ip, 1900, 1000);//给显示窗口分配一个线程,确保其正常运行cv::startWindowThread();//filename为hanzi.png的绝对路径std::string filename = "/home/aaeon/work/wangxin/test_rtsp1/hanzi.png";//cv::Mat png = cv::imread(filename);//以下过程为蒙皮的准备过程,filename为hanzi.png的绝对路径//imread(filename, 0),其中0为取图片的灰度图cv::Mat graypng = cv::imread(filename, 0);//cv::threshold中的150为区别hanzi.png中的红色字体和白色背景的阈值;红色的灰度值为255/2.0//此时graypng中,汉字为黑色,背景为白色cv::threshold(graypng, graypng, 150, 255, cv::THRESH_BINARY);//此时mask中,汉字为白色,背景为黑色cv::Mat mask = 255 - graypng;//png为hanzi.png原图cv::Mat png = cv::imread(filename);cv::Mat imROI;while (isOpen) {mut.lock();frame.copyTo(temp_frame);mut.unlock();if (temp_frame.empty()) {continue;}std::cout << "cols: " << temp_frame.cols << ", rows: " << temp_frame.rows << "\n";// 以下两行代码为蒙皮的处理过程imROI = temp_frame(cv::Rect(100, 100, png.cols, png.rows));//cv::imshow("imROI", imROI);png.copyTo(imROI, mask);cv::imshow(ip, temp_frame);cv::waitKey(100);if (cv::waitKey(1) == 'q') {break;}}cv::destroyAllWindows();isOpen = false;t.join();return 0;
}
aaeon@aaeon-desktop:~/work/wangxin/test_rtsp1$ vim test_rtsp.cppif (mut.try_lock()) {frame.copyTo(*pFrame);mut.unlock();}cv::waitKey(5);}capture.release();
}

其中,我做注释的地方,都需要注意下,尤其是涉及摄像头账号、密码、ip等信息,需要你自己填写。

  • 编译及运行

在项目目录test_rtsp下,

cd ~/test_rtsp
mkdir build
cd build
cmake ..
make
./test_rtsp

效果如下:

jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)相关推荐

  1. C语言实现牛顿-拉夫逊newton raphson求近似根roots(附完整源码)

    实现牛顿-拉夫逊newton raphson求近似根 实现以下几个相关的接口 实现牛顿-拉夫逊newton raphson求近似根的完整源码(定义,实现,main函数测试) 实现以下几个相关的接口 d ...

  2. 曼格短视频小程序V1.8.5版本完整源码

    介绍: 此款小程序适用范围,曼格短视频小程序.曼格短视频.短视频小程序.视频小程序.微信小程序,亲测无错可运营. 程序源码介绍: 1.新增自定义界面颜色,你的地盘你做主,不要再担心"撞衫&q ...

  3. java调用easyxml接口_【技术教程】如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口?...

    原标题:[技术教程]如何通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口? RTSP协议视频平台EasyNVR经过多年的积累,已经是一套成熟且完善的视频平台了,用户可以通过网页直接访 ...

  4. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码

    HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...

  5. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  6. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  7. 基于改进YOLOv7&OpenCV的行人过马路速度与交通灯实时监测系统(源码&教程)

    1.研究背景 横穿马路的行人运动速度太快.太慢或者突变都可能影响驾驶者的判断,从而导致交通事故.车载辅助系统应能够在交通路口为驾驶者提供异常行人的速度预判信息.文献[1-2]通过对不同红绿灯情形进行建 ...

  8. 基于OpenCV的刷脸考勤&人脸校验&用户管理系统(源码&教程)

    1.研究背景 随着人工智能时代的来临,深度学习赋予了以人脸图像为中心的计算机视觉任务更多的可能.人脸检测是人脸识别系统组成的关键部分之一,其目的是检测出任意给定图片中的包含的一个或多个人脸,是人脸识别 ...

  9. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码...

    HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...

最新文章

  1. oracle和arcgis优势,Oracle spatial 使用的一些感受
  2. SystemView软件中“Butterworth Lowpass IIR“的完美设置
  3. Github拉取远端的时候提示“ssh: connect to host github.com port 22: Connection timed out”错误...
  4. java切割文件_Java如何将大文件切割成小文件
  5. 使用Anemometer基于pt-query-digest将MySQL慢查询可视化
  6. Spark最新的两大研发方向深度学习和结构化流处理
  7. 关于华为鸿蒙的三个核心问题
  8. Angular 项目里的 tsconfig.json
  9. 深度学习特征归一化方法——BN、LN、IN、GN
  10. 使用sar进行性能分析
  11. CrystalMaker 10.6.2 mac版 CrystalMaker X最新版
  12. JDBC连接SQL Server 2005问题
  13. error: Unable to find vcvarsall.bat
  14. MS08067利用方法
  15. 风力摆控制系统设计经验总结
  16. 异常解决:Generated keys not requested. You need to specify Statement.RETURN_GENERA_KEYS to Statement.
  17. 一切从项目Kick Off开始
  18. 60著名条原则和定理
  19. Git版本控制管理——储藏和引用日志
  20. 微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单

热门文章

  1. php页面审核,深入理解用PHP实现页面注册审核
  2. Python爬虫的智能化解析——Diffbot
  3. PyTorch的hook及其在Grad-CAM中的应用
  4. 【文献阅读】Self-Normalizing Neural Networks
  5. 实验4 C++程序的结构(4学时)
  6. 用openbabel将pdbqt文件转成pdb
  7. [贪心算法] 例6.1 FatMouse' Trade
  8. LeetCode 647. 回文子串 (动态规划)
  9. Java面向对象的程序设计
  10. vue如何保存登录状态到全局?【vue状态管理】