Commit 98da9ad0 authored by jiajunjie's avatar jiajunjie

update object tracking interface

parent a4bddd26
cmake_minimum_required(VERSION 2.6)
project(tracker)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
# vars
set(OPENCV_INCLUDE /usr/local/include/)
set(OPENCV_LIBPATH /usr/local/lib/)
set(OPENCV_LIBS opencv_highgui opencv_core opencv_imgproc opencv_videoio opencv_tracking opencv_ml opencv_objdetect opencv_imgcodecs)
# compile flags
SET(CMAKE_CXX_FLAGS "-W -Wall -Wno-sign-compare -fPIC -std=c++11 -O2")
# include path
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${OPENCV_INCLUDE})
# library path
link_directories(${OPENCV_LIBPATH})
ADD_SUBDIRECTORY(src)
cmake_minimum_required(VERSION 2.6)
project(trackers)
# source
file(GLOB LIB_SRCS ./*.cpp)
# shared library
ADD_LIBRARY(${CMAKE_PROJECT_NAME} SHARED ${LIB_SRCS})
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${OPENCV_LIBS} )
/**
* @file common.h
*
* @brief
*
* 定义接口错误码
*
* @copyright
*
* 无锡优波生命科技有限公司
* All Rights Reserved.
*/
#pragma once
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
typedef enum {
///< 正确
FACE_OK,
///< 参数错误
FACE_ERR_INVALID_PARAM,
///< 内存不足
FACE_ERR_NO_FREE_MEMORY,
///< 输入图像错误
FACE_ERR_INVALID_IMAGE
}FACE_ERROR_E;
/**
* @file muti_tracker.cpp.
*
* @brief
*
* 定义戴口罩检测接口文件
*
* @copyright
*
* 无锡优波生命科技有限公司
* All Rights Reserved.
*/
#include <string>
#include <vector>
#include <iostream>
#include <memory>
#include <utility>
#include <fstream>
#include <sstream>
#include "tracker.h"
#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp>
#define IMG_WIDHT_SIZE 128
#define IMG_HEIGHT_SIZE 128
using namespace cv;
using namespace std;
struct object_param{
int trackerId;
object_param() {
trackerId =0;
}
};
struct tracker_param
{
bool bParamIsOk;
int counts;
MultiTracker mttrackers;
vector<Rect2d> objects;
vector<Rect2d> objects_save;
vector<int > trackerIds;
tracker_param()
{
bParamIsOk = false;
counts = 0;
objects.clear();
objects_save.clear();
trackerIds.clear();
}
};
struct muti_tracker_instance
{
std::shared_ptr<tracker_param> _param;
};
cv::Ptr<cv::Tracker> createTrackerByName(std::string name)
{
cv::Ptr<cv::Tracker> tracker;
if (name == "KCF")
tracker = cv::TrackerKCF::create();
else if (name == "TLD")
tracker = cv::TrackerTLD::create();
else if (name == "BOOSTING")
tracker = cv::TrackerBoosting::create();
else if (name == "MEDIAN_FLOW")
tracker = cv::TrackerMedianFlow::create();
else if (name == "MIL")
tracker = cv::TrackerMIL::create();
else if (name == "GOTURN")
tracker = cv::TrackerGOTURN::create();
else
CV_Error(cv::Error::StsBadArg, "Invalid tracking algorithm name\n");
return tracker;
}
muti_tracker_instance * muti_tracker_init( vector<Rect2d> objects,
/* std::string trackerType = "KCF",*/
int rows,int cols, unsigned char* imgdata)
{
if (NULL == imgdata) {
cout << "detImage is empty" << endl;
return NULL;
}
cv::Mat frame(rows, cols, CV_8UC3, (void *)imgdata);
std::vector<Ptr<Tracker> > algorithms;
algorithms.clear();
int objects_num = objects.size();
for(int i =0; i<objects_num; i++) {
algorithms.push_back( createTrackerByName("KCF") );
}
muti_tracker_instance *_instance = new muti_tracker_instance();
if (NULL == _instance) {
return NULL;
}
_instance->_param = std::make_shared<tracker_param>();
_instance->_param->objects = objects;
MultiTracker trackers;
_instance->_param->mttrackers = trackers;
_instance->_param->mttrackers.add(algorithms, frame, _instance->_param->objects);
_instance->_param->bParamIsOk = true;
return _instance;
}
int muti_tracker_estimate(
muti_tracker_instance *instance,
int rows, int cols, unsigned char* imgdata,
int rate, struct tracker_info* ptracker)
{
if (!instance || !instance->_param->bParamIsOk) {
cout << "param is NULL" << endl;
return -1;
}
if (NULL == imgdata) {
cout << "imgdata is empty" << endl;
return -1;
}
if (NULL == ptracker) {
cout << "ptracker is NULL" << endl;
return -1;
}
cv::Mat frame(rows, cols, CV_8UC3, (void *)imgdata);
vector<Rect2d> objects = instance->_param->objects;
vector<Rect2d> objects_save = instance->_param->objects_save;
for(int i=0; i< objects.size(); i++)
{
bool track_object_flag =false;
int cx = objects[i].x + objects[i].width/2;
int cy = objects[i].y + objects[i].height/2;
//circle(frame,cv::Point(centerPoint_x,centerPoint_y),5,Scalar(255,0,0));
//rectangle(frame, instance->_param->objects[i], Scalar(255, 0, 0), 2, 1);
for(int j=0; j< objects_save.size(); j++)
{
int max_objects_save_x = (int)(objects_save[j].x + objects_save[j].width) +rate;
int max_objects_save_y =(int)(objects_save[j].y + objects_save[j].height) +rate;
int min_objects_save_x =(int)(objects_save[j].x - rate);
int min_objects_save_y =(int)(objects_save[j].y - rate);
//circle(frame,cv::Point(max_objects_save_x,max_objects_save_y),5,Scalar(0,255,0));
// rectangle(frame, face_save.objects[j], Scalar(0, 0,255), 2, 1);
/////////////////check whehter exist face in screen////////////
if( cx > min_objects_save_x && cx < max_objects_save_x
&& cy > min_objects_save_y && cy < max_objects_save_y )
{
track_object_flag = true;
instance->_param->trackerIds.push_back( instance->_param->trackerIds[j] );
break;
}
}//end of for j
if( !track_object_flag ) {//add objects
instance->_param->counts++;
instance->_param->trackerIds.push_back( instance->_param->counts );
}
}//end of i
instance->_param->objects_save = instance->_param->objects;
instance->_param->mttrackers.update(frame, instance->_param->objects);
ptracker->trackerIds = instance->_param->trackerIds;
ptracker->objects = instance->_param->objects_save;
return 0;
}
bool muti_tracker_destory(
muti_tracker_instance *instance
)
{
if (instance)
delete instance;
return true;
}
/**
* @file tracker.h.
*
* @brief
*
* 定义戴多目标跟踪接口
*
* @copyright
*
* 无锡优波生命科技有限公司
* All Rights Reserved.
*/
#pragma once
#include "common.h"
extern "C"
{
struct tracker_info
{
vector<Rect2d> objects;
vector<int> trackerIds;
tracker_info()
{
objects.clear();
trackerIds.clear();
}
};
struct muti_tracker_instance;
/**
* @brief 初始化多目标追踪功能
*
* @param objects 跟踪对象目标
* @param trackerType 采用的跟踪方式
*
* @return muti_tracker_instance 返回窗口句柄指针
*/
muti_tracker_instance* muti_tracker_init( vector<Rect2d> objects,
/*std::string trackerType = "KCF",*/
int rows,int cols, unsigned char* imgdata);
/**
* @brief 执行戴口罩检测判断
*
* @param muti_tracker_instance 输入窗口句柄指针
* @param rows 输入需要检测的图像行
* @param cols 输入需要检测的图像列
* @param imgdata 输入需要检测的图像数据
* @param rate 比对时边框增减的大小
* @param ptracker 获取跟踪的人脸框和ID号
*
* @return int 返回结果
*/
int muti_tracker_estimate(
muti_tracker_instance *instance,
int rows,
int cols,
unsigned char* imgdata,
int rate,
struct tracker_info* ptracker
);
/**
* @brief 销毁句柄
*
* @param instance 需要销毁的句柄
*
* @return bool 返回True表示成功
*/
bool muti_tracker_destory(
muti_tracker_instance *instance
);
}
该目录下存放armv7架构相关库文件
该目录下存放x86平台下opencv相关库文件
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment