在ffmpeg.c中使用包含opencv的so库

文章目录

  • 新建一个引用opencv的so工程
    • 生成.so库中的测试例子
    • 生成.so库
    • 用nm命令查看是否导出了函数
  • 在测试工程.c文件中引入这个.so库
    • 准备工作
    • 编译测试
  • 在ffmpeg.c中引入这个so库
    • 准备工作
    • 测试使用
  • 参考链接

新建一个引用opencv的so工程

新建的测试工程,仅仅是通过输入一个图像路径,显示出来

use_opencv.h文件如下

#ifndef __HEADER_H__
#define __HEADER_H__

#ifdef __IMPORT_FUNC__
extern "C" {
void test_opencv(char* img_path);
}
#else
void test_opencv(char* img_path);
#endif

#endif

use_opencv.cpp文件如下

#include 
using namespace std;
#include 
#include 
using namespace cv;//使用命名空间

#define __IMPORT_FUNC__
#include "use_opencv.h"


void test_opencv(char* img_path)
{
	cout << "hello opencv2222." << endl;

	Mat img = imread(img_path, 0); // 读取图片 这里文件地址写成你想打开的文件的地址或者放在执行目录里就不用写路径直接使用文件名字
	imshow("load image",img);//在窗口中打开图片
	waitKey(100000);//等待时间,这里等待时间最好别填零,要不打开的窗口秒退
}

int main()
{
	char *img_path = "/home/zeng/ffmpeg/ffmpeg-4.2.2/1.jpg";
	test_opencv(img_path);

	return 0;
}

生成.so库中的测试例子

用下面的命令先生成测试二进制文件

g++ use_opencv.cpp -o use_opencv -I/usr/local/include/ -I/usr/lcoal/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -lopencv_imgproc -lopencv_highgui -lopencv_core -lopencv_imgcodecs

运行这个二进制文件,如果成功,在继续

在ffmpeg.c中使用包含opencv的so库_第1张图片

生成.so库

再用如下的命令生成一个.so库

g++ use_opencv.cpp -shared -o libuse_opencv.so -O0 -fPIC -g3 -Wall -I/usr/local/include/ -I/usr/lcoal/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -lopencv_imgproc -lopencv_highgui -lopencv_core -lopencv_imgcodecs

这就是生成的.so库

在ffmpeg.c中使用包含opencv的so库_第2张图片

用nm命令查看是否导出了函数

用如下命令查看.so库是否导出了对应的函数test_opencv

nm -D libuse_opencv.so |grep test_opencv

可以看到对应的函数已经导出,前面是T的

在这里插入图片描述

在测试工程.c文件中引入这个.so库

新建一个项目,在main函数中调用这个.so库中的test_opencv函数

test_ffmpeg.c代码如下

#include 
#include 

#include "use_opencv.h"

int main(void) {
	puts("!!!Hello World2!!!"); /* prints !!!Hello World!!! */

	char *img_path = "/home/zeng/ffmpeg/ffmpeg-4.2.2/1.jpg";
	test_opencv(img_path);

	return EXIT_SUCCESS;
}

准备工作

拷贝use_opencv.h到/usr/local/include中

sudo cp use_opencv.h /usr/local/include/

拷贝libuse_opencv.so到/usr/local/lib中

sudo cp libuse_opencv.so /usr/local/lib/

在这里插入图片描述

编译测试

使用如下命令,编译test_ffmpeg.c,得到二进制文件test_ffmpeg

gcc test_ffmpeg.c -o test_ffmpeg -I/usr/local/include/ -L/usr/local/lib/ -luse_opencv

执行这个测试用的二进制文件,也可以看到效果

在ffmpeg.c中使用包含opencv的so库_第3张图片

在ffmpeg.c中引入这个so库

准备工作

打开ffmpeg.c,加入使用的部分代码

在ffmpeg.c中使用包含opencv的so库_第4张图片

修改fftools下的Makefile,加入如下两行

$$(OBJS-$(1)): CFLAGS  += -I/usr/local/include
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += -luse_opencv

在ffmpeg.c中使用包含opencv的so库_第5张图片

测试使用

对ffmpeg项目进行配置,生成ffmpeg.c

./configure --enable-gpl --enable-nonfree --enable-pthreads --extra-cflags=-g --extra-cflags=-O0 --extra-libs=-lstdc++ --extra-cxxflags=-g --extra-cxxflags=-O0 --extra-cxxflags=-fpermissive --enable-debug=3 --disable-optimizations --disable-stripping --enable-libx264 --disable-doc --disable-htmlpages --disable-ffplay --disable-ffprobe

生成ffmpeg之后,使用如下命令调用ffmpeg

ffmpeg -i input.mp4 -vcodec h264 -max_muxing_queue_size 1024 out.mp4

可以看到结果如下,说明.so库已经可以使用

在ffmpeg.c中使用包含opencv的so库_第6张图片

用ldd查看一下生成的ffmpeg也可以看到依赖了对应的so库

在ffmpeg.c中使用包含opencv的so库_第7张图片

参考链接

  • error adding symbols: DSO missing from command line
  • linux程序分析工具介绍—ldd,nm
  • #if、#else、#endif、#elif、#ifdef、#ifndef的区别和使用
  • 在eclipse中新建一个.so项目

你可能感兴趣的:(Linux)