还是以OpenTLD为例,编写的Makefile和python调用cpp。
代码直接下载:Here。 (Makefile文件最后一行rm -r interface.so前面的空格要删去,换成tab)
Makefile文件如下:
CC=g++
AR=ar rc
OBJ_DIR=lib
OUTPUT_DIR=output
INCLUDE_FLAGS=-I./include -I./opencv_include
CPP_FLAGS=-std=c++11 -pthread -fPIC
LD_PATH_FLAGS=-L. -L./lib -L./boost_lib -L./opencv_lib
LD_FLAGS= -lopencv_highgui -lopencv_core -lopencv_nonfree -lopencv_legacy -lopencv_video -lopencv_imgproc -lOpenTLD
MACRO_FLAGS=-D_REENTRANT
ifeq ($(CPU_ONLY),1)
MACRO_FLAGS += -D CPU_ONLY
endif
#libOpenTLD: $(OBJ_DIR)/FerNNClassifier.o $(OBJ_DIR)/LKTracker.o $(OBJ_DIR)/TLD.o $(OBJ_DIR)/tld_utils.o
# $(CC) -shared -o libOpenTLD.so $^ $(LD_PATH_FLAGS) $(LD_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/FerNNClassifier.o: FerNNClassifier.cpp
# $(CC) -c -O2 -g -o $@ FerNNClassifier.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/LKTracker.o: LKTracker.cpp
# $(CC) -c -O2 -g -o $@ LKTracker.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/TLD.o: TLD.cpp
# $(CC) -c -O2 -g -o $@ TLD.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/tld_utils.o: tld_utils.cpp
# $(CC) -c -O2 -g -o $@ tld_utils.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
interface: $(OBJ_DIR)/interface.o $(OBJ_DIR)/libOpenTLD.so
$(CC) -shared -o interface.so $^ $(LD_PATH_FLAGS) $(LD_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
$(OBJ_DIR)/interface.o: interface.cpp
$(CC) -c -O2 -g -o $@ interface.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
clean:
rm -f $(OBJ_DIR)/*.o
rm -f libOpenTLD.so
rm -f interface.so
用c封装一层代码如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include<opencv2/legacy/legacy.hpp>
#include "tld_utils.h"
#include <iostream>
#include <sstream>
#include "TLD.h"
#include <stdio.h>
using namespace std;
using namespace cv;
#ifdef __cplusplus
extern "C" {
TLD tld;
bool tl = true;
//FILE *bb_file = fopen("./bounding_boxes.txt", "w");
/*
void tld_read() {
string filename = "./parameters.yml";
FileStorage fsto(filename, FileStorage::READ);
tld.read(fsto.getFirstTopLevelNode());
}*/
/*
void tld_init(const cv::Mat& last_gray,const cv::Rect &box) {
//TLD initialization
tld.init(last_gray, box, bb_file);
} */
/*
bool tld_processFrame(const cv::Mat& last_gray,const cv::Mat& current_gray){
BoundingBox pbox;
vector<Point2f> pts1;
vector<Point2f> pts2;
bool status = true;
tld.processFrame(last_gray, current_gray, pts1, pts2, pbox, status, tl, bb_file);
return status;
}*/
}
#endif
python调用.so测试:
# -*- coding: utf-8 -*-
import os
import ctypes
current_dir = os.getcwd()
ctypes.CDLL(os.path.join(current_dir, "libOpenTLD.so"), ctypes.RTLD_GLOBAL)
so = ctypes.CDLL(os.path.join(current_dir, "libOpenTLD.so"))