文章目錄
新建一個引用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 <iostream>
using namespace std;
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
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
運行這個二進制文件,如果成功,在繼續
生成.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庫
用nm命令查看是否導出了函數
用如下命令查看.so庫是否導出了對應的函數test_opencv
nm -D libuse_opencv.so |grep test_opencv
可以看到對應的函數已經導出,前面是T的
在測試工程.c文件中引入這個.so庫
新建一個項目,在main函數中調用這個.so庫中的test_opencv函數
test_ffmpeg.c代碼如下
#include <stdio.h>
#include <stdlib.h>
#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中引入這個so庫
準備工作
打開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庫