新建的测试工程,仅仅是通过输入一个图像路径,显示出来
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;
}
用下面的命令先生成测试二进制文件
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
运行这个二进制文件,如果成功,在继续
再用如下的命令生成一个.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库
用如下命令查看.so库是否导出了对应的函数test_opencv
nm -D libuse_opencv.so |grep test_opencv
可以看到对应的函数已经导出,前面是T的
新建一个项目,在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,加入使用的部分代码
修改fftools下的Makefile,加入如下两行
$$(OBJS-$(1)): CFLAGS += -I/usr/local/include
$(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIBS += -luse_opencv
对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库已经可以使用
用ldd查看一下生成的ffmpeg也可以看到依赖了对应的so库