ubuntu下make编译生成动态库,然后python调用cpp。


还是以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"))



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值