opencv的使用(Ubuntu linux环境,AS jni,AS java)
最近要完成一个功能,就是把四个视频合成左右上下分布的一个视频。尝试很多方法,最终使用opencv来实现该功能。(通过opencv实现的视频好像没有声音。)研究的步骤,首先在Ubuntu环境测试,该功能是否实现。然后再将生成的库文件放到AS中,使用jni的方法调用,或者将源码放到AS中利用jni技术。在实现过程中遇到很多问题,下面记录。
一、在ubuntu linux环境使用opencv。
1、下载opencv安装包。
下载地址:官网:https://opencv.org/releases/
git地址:https://github.com/opencv/opencv/releases
2、将下载的安装包放到虚拟机根目录(新建software目录)。
3、安装包解压缩。
unzip opencv-4.8.0.zip
4、下载相关软件。
进入 opencv-4.8.0 文件夹。
1)更新软件
sudo apt-get update
2)安装cmake
sudo apt-get install cmake
3) 安装依赖库
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
4)在 opencv-4.8.0 文件夹下新建build文件夹。
mkdir build
5)进入build文件夹,使用命令修改参数
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
6)使用make编译
sudo make
7)安装
sudo make install
8)配置环境
sudo gedit /etc/ld.so.conf.d/opencv.conf
在新建的文档中添加:
/usr/local/lib
sudo ldconfig
配置路径生效。
9)配置bash
sudo gedit /etc/bash.bashrc
在最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
执行该步骤时,发现/usr/local/lib/路径下没有pkgconfig文件夹。并且执行命令
pkg-config --cflags openc
报一下错误。
解决:首先创建opencv.pc文件,这里要注意它的路径信息:
cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
然后在opencv.pc中添加以下信息,注意这些信息需要与自己安装opencv时的库路径对应:(一下是我自己的内容)
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.8.0
Libs: -L${exec_prefix}/lib -lopencv_highgui -lopencv_shape -lopencv_objdetect -lopencv_ml -lopencv_superres -lopencv_dnn -lopencv_stitching -lopencv_videostab -lopencv_calib3d -lopencv_videoio -lopencv_imgcodecs -lopencv_features2d -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
保存退出,添加环境:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
执行.cpp编译命令:
g++ videotest.cpp -o videotest `pkg-config --cflags --libs opencv`
报错:
再执行编译命令:
g++ videotest.cpp -o videotest `pkg-config --cflags --libs opencv` -std=gnu++11
报错:
查看/usr/local/lib/lib文件下没有libopencv_shape.so等这三个库,再次打开/usr/local/lib/pkgconfig/opencv.pc文件,将-lopencv_shape 等三个路径删除掉。保存退出。执行命令:
g++ videotest.cpp -o videotest `pkg-config --cflags --libs opencv` -std=gnu++11
编译成功。
最后的opencv.pc文件:
# Package Information for pkg-configprefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.8.0
Libs: -L${exec_prefix}/lib -lopencv_highgui -lopencv_objdetect -lopencv_ml -lopencv_dnn -lopencv_stitching -lopencv_calib3d -lopencv_videoio -lopencv_imgcodecs -lopencv_features2d -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
注意:1、该opencv源码编译的对应so库文件只是linux系统平台文件(我的是x86_64),如果想将该库编译为其他平台,例如arm64需要交叉编译。(我没整明白)
注意:2、上述配置bash后,使用以下命令使得配置文件生效。若没有生效,重启电脑试试。(如果没有生效,执行 编译生成的可执行文件,报错 找不到opencv库)
source /etc/bash.bashrc
sudo updatedb
注意:3 我这里编译的是opencv4.8.0版本,编译过程中使用python3.x版本,opencv.pc需要自己创建。链接http://www.taodudu.cc/news/show-3639538.html?action=onClick#google_vignette 编译的opencv3.4.1版本,使用python2.x版本,opencv.pc自动生成。按照链接中配置,就可以成功编译安装opencv。
最后是测试代码,功能将代码中的video.mp4合成上下左右分布的一个视频。生成视频为mergevideo.avi 或mergevideo.mkv
#include <iostream>
#include <opencv2/opencv.hpp>
#include <unistd.h>
#include <error.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <pthread.h>
#include <linux/videodev2.h>
#include <sys/mman.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <string>using namespace std;
using namespace cv;
int main(int argc, char ** argv)
{std::string videoFile = "video.mp4";//视频的路径std::string videoFile1 = "video.mp4";//视频的路径std::string videoFile2 = "video.mp4";//视频的路径std::string videoFile3 = "video.mp4";//视频的路径/** 打开第一个视频文件 */VideoCapture cap; //视频句柄变量cap.open(videoFile);//打开视频if(!cap.isOpened()) //判断是否打开了{ printf("1cap.isOpened is error\n");return -1; } /** 打开第二个视频文件 */VideoCapture cap1; //视频句柄变量cap1.open(videoFile1);//打开视频if(!cap1.isOpened()) //判断是否打开了{ printf("2cap.isOpened is error\n");return -1; } /** 打开第三个视频文件 */VideoCapture cap2; //视频句柄变量cap2.open(videoFile2);//打开视频if(!cap2.isOpened()) //判断是否打开了{ printf("3cap.isOpened is error\n");return -1; } /** 打开第四个视频文件 */VideoCapture cap3; //视频句柄变量cap3.open(videoFile3);//打开视频if(!cap3.isOpened()) //判断是否打开了{ printf("4cap.isOpened is error\n");return -1; } /** 打开第一个视频文件的帧数 */int frame_num = cap.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "videoFile total frame number is: " << frame_num << std::endl;/** 打开第二个视频文件的帧数 */int frame_num1 = cap1.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "videoFile1 total frame number is: " << frame_num1 << std::endl;/** 打开第三个视频文件的帧数 */int frame_num2 = cap2.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "videoFile2 total frame number is: " << frame_num2 << std::endl;/** 打开第四个视频文件的帧数 */int frame_num3 = cap3.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "videoFile3 total frame number is: " << frame_num3 << std::endl;/** 打开第一个视频文件的帧率 */int fps = cap.get(cv::CAP_PROP_FPS);std::cout << "videoFile fps: " << fps << std::endl;/** 打开第二个视频文件的帧率 */int fps1 = cap1.get(cv::CAP_PROP_FPS);std::cout << "videoFile1 fps1: " << fps1 << std::endl;/** 打开第三个视频文件的帧率 */int fps2 = cap2.get(cv::CAP_PROP_FPS);std::cout << "videoFile fps2: " << fps2 << std::endl;/** 打开第四个视频文件的帧率 */int fps3 = cap3.get(cv::CAP_PROP_FPS);std::cout << "videoFile1 fps3: " << fps3 << std::endl;/** 打开第一个视频文件的宽度 */int image_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "videoFile image width is: " << image_width << std::endl;/** 打开第二个视频文件的宽度 */int image_width1 = cap1.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "videoFile1 image width is: " << image_width1 << std::endl;/** 打开第三个视频文件的宽度 */int image_width2 = cap2.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "videoFile2 image width is: " << image_width2 << std::endl;/** 打开第四个视频文件的宽度 */int image_width3 = cap3.get(cv::CAP_PROP_FRAME_WIDTH);std::cout << "videoFile3 image width is: " << image_width3 << std::endl;/** 打开第一个视频文件的高度 */int image_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "videoFile image height: " << image_height << std::endl;/** 打开第二个视频文件的高度 */int image_height1 = cap1.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "videoFile1 image height: " << image_height1 << std::endl;/** 打开第三个视频文件的高度 */int image_height2 = cap2.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "videoFile2 image height: " << image_height2 << std::endl;/** 打开第四个视频文件的高度 */int image_height3 = cap3.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "videoFile3 image height: " << image_height3 << std::endl;/** 打开第一个视频文件的矩阵对象的格式*/int frame_format = cap.get(cv::CAP_PROP_FORMAT);std::cout << "videoFile frame format: " << frame_format << std::endl;/** 打开第二个视频文件的矩阵对象的格式 */int frame_format1 = cap1.get(cv::CAP_PROP_FORMAT);std::cout << "videoFile1 frame format: " &
相关文章:

opencv的使用(Ubuntu linux环境,AS jni,AS java)
最近要完成一个功能,就是把四个视频合成左右上下分布的一个视频。尝试很多方法,最终使用opencv来实现该功能。(通过opencv实现的视频好像没有声音。)研究的步骤,首先在Ubuntu环境测试,该功能是否实现。然后再将生成的库文件放到AS中,使用jni的方法调用,或者将源码放到A…...
ChatGPT(对话AI)汇总
ChatGPT的全称为”Conversational Generative Pre-trained Transformer”,是一个基于预训练的自然语言处理模型。 1.商量SenseChat(商汤) SenseChat (sensetime.com) 2.文心一言(百度) 文心一言 (baidu.com) 3.百…...

【Docker】用Dockerfile制作个人的镜像文件
作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖…...
前端面试基础面试题——4
1.谈谈你对 ES6 的理解 2.说说你对 promise 的了解 3.解构赋值及其原理 4.Vue常用的修饰符及使用的场景 5.vue 中 key 值的作用 6.什么是 vue 的计算属性? 7.watch的作用是什么 8.计算属性的缓存和方法调用的区别 9.响应式系统的基本原理 10.vue-loader …...

【08期】ArrayList常见面试题
简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作…...

Android studio之GridView使用
目录 效果图:代码: 效果图: 代码: UserGridviewAdapter package com.example.gridviewpro.Adapter;import android.content.Contex…...
Ubuntu系统环境搭建(七)——Ubuntu安装MySQL8.0
ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(七)——Ubuntu安装MySQL8.0 文章目录 Ubuntu系统环境搭建(七)——Ubuntu安装MySQL8.01、安装1.1、下载1.2、解压安装 2、配置工作2.1、基本设置2.1.1、文件夹重命名…...

Nginx详解 三:高级配置
文章目录 1. 网页的状态页2. Nginx第三方模块2.1 echo模块 3. 变量3.1 内置变量3.1.1 示例 3.2 自定义变量3.2.1 自定义访问日志3.2.2 自定义json 格式日志 3.4 Nginx压缩功能 4. HTTPS4.1 Nginx的HTTPS工作原理4.2 启用功能模块的配置过程 5、自定义图标 1. 网页的状态页 基于…...
mysql 表备份 遇到的问题 【全网最全】
目录 省流: 正文: 1、报错 2、原因 3、解决方法 方法一:关闭 ENFORCE_GTID_CONSISTENCY (不推荐): 方法二(推荐): 4、开启关闭GTID 省流: 不推荐如…...

11.添加侧边栏,并导入数据
修改CommonAside的代码: <template><div><el-menu default-active"1-4-1" class"el-menu-vertical-demo" open"handleOpen" close"handleClose":collapse"isCollapse"><!--<el-menu-it…...

ThinkPHP 通用的API格式封装
ThinkPHP 通用的API格式封装 1.创建status.php 用于设置通用的状态码返回枚举类2.将API返回格式统一封装3.重写BaseController中的__call方法4.在控制器下面新建Error控制器,然后添加__call方法 1.创建status.php 用于设置通用的状态码返回枚举类 <?phpreturn[…...
自己动手写数据库:实现一个小型 SQL 解释器(下)
本节我们完成 SQL 解释器的最后一部分,它涉及到数据的删除和更改,首先我们看删除语句的解析。我们先看 delete 对应的语法: Delete -> DELETE FROM ID (where Predicate)?从语法规则可以看出,delete 语句必须以关键字 DELETE…...

2023年信息安全管理与评估任务书模块一网络平台搭建与设备安全防护
全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 比赛时间 本阶段比赛时长为180分钟。 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 9:00- 12:00 …...
JS -RSA 明文加密--用户密码加密
1 配置文件引入 加密包 package.json "jsencrypt": "^3.0.0-rc.1",2 加密公钥配置 import { JSEncrypt } from jsencrypt import request from "/utils/request";const RSA_PUBLIC_KEY "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJVol0cJ…...
clickhouse中replacingMergeTree
ReplacingMergeTree是在MergeTree上添加了去重的功能,但是这个功能不可控,合并是一个后台的操作,除非手动触发,不然无法控制,并且它会删除具有相同(区内)主键的重复项。 特点: 1,去重时机不定&a…...

pdf怎么转换成word?
随着数字化时代的到来,PDF(Portable Document Format)已成为最受欢迎的文档格式之一,因其在各种设备上的可视性和稳定性而备受推崇。然而在某些情况下,将PDF转换为Word文档可能是必要的,这使得编辑、修改和重新格式化文本变得更加…...
汇编攻城记-Cortex-M3指令集
类型 指令 全称 功能 内存访问 LDR Load register 加载字到寄存器 LDRB 加载字节到寄存器 LDRH 加载半字到寄存器 LDRSH 加载半字到寄存器,再带符号扩展到32位 LDRD 从连续的地址空间加载双字(64位整数)到…...

大语言模型之五 谷歌Gemini
近十年来谷歌引领着人工智能方向的发展,从TensorFlow到TPU再到Transformer,都是谷歌在引领着,然而,在大语言模型上,却被ChatGPT(OpenAI)抢了风头,并且知道GPT-4(OpenAI&a…...
使用selenium实现对页面元素的抓取
一、背景介绍 工作中有个需求是需要对某个页面进行监控,但由于要监控页面数据是异步加载的,因此很难从状态码和返回结果层面进行校验。于是乎想到了通过判断页面元素是否存在且显示内容是否正确来达到此目标。调研了一下发现selenium可以实现对这种动态…...

大数据课程K12——Spark的MLlib概述
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的MLlib概念; ⚪ 掌握Spark的MLlib基本数据模型; ⚪ 掌握Spark的MLlib统计量基础; 一、Spark MLlib介绍 1. 概述 MLlib是Apache Spark的可迭代机器学习库。 2. 易于使用 …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...

篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...