前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ubuntu下make编译生成动态库,然后python调用cpp。

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

作者头像
MachineLP
发布2018-01-09 15:17:28
1.5K0
发布2018-01-09 15:17:28
举报

还是以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"))
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档