OpenCV 4.11.0
开源计算机视觉库
|
本教程将指导您学习如何:
添加类头文件
新算法的类头文件应添加到include/opencv2/face中的新文件中。以下是一个可用于集成新算法的模板,将FacemarkNEW更改为新算法的代表性名称,并使用相应的代表性文件名保存。
@code{.cpp} class CV_EXPORTS_W FacemarkNEW : public Facemark { public: struct CV_EXPORTS Config { Config(); /*read only parameters - just for example*/ double detect_thresh; //!< detection confidence threshold double sigma; //!< another parameter void read(const FileNode& /*fn*/); void write(FileStorage& /*fs*/) const; }; /*Builder and destructor*/ static Ptr<FacemarkNEW> create(const FacemarkNEW::Config &conf = FacemarkNEW::Config() ); virtual ~FacemarkNEW(){}; }; @endcode
添加实现代码
在源代码文件夹中创建一个新文件,其名称代表新算法。以下是一个可用的模板。
@code{.cpp} #include "opencv2/face.hpp" #include "precomp.hpp" namespace cv { FacemarkNEW::Config::Config(){ detect_thresh = 0.5; sigma=0.2; } void FacemarkNEW::Config::read( const cv::FileNode& fn ){ *this = FacemarkNEW::Config(); if (!fn["detect_thresh"].empty()) fn["detect_thresh"] >> detect_thresh; if (!fn["sigma"].empty()) fn["sigma"] >> sigma; } void FacemarkNEW::Config::write( cv::FileStorage& fs ) const{ fs << "detect_thresh" << detect_thresh; fs << "sigma" << sigma; } /*implementation of the algorithm is in this class*/ class FacemarkNEWImpl : public FacemarkNEW { public: FacemarkNEWImpl( const FacemarkNEW::Config &conf = FacemarkNEW::Config() ); void read( const FileNode& /*fn*/ ); void write( FileStorage& /*fs*/ ) const; void loadModel(String filename); bool setFaceDetector(bool(*f)(InputArray , OutputArray, void * extra_params)); bool getFaces( InputArray image , OutputArray faces, void * extra_params); Config config; protected: bool addTrainingSample(InputArray image, InputArray landmarks); void training(); bool fit(InputArray image, InputArray faces, InputOutputArray landmarks, void * runtime_params); Config config; // configurations /*proxy to the user defined face detector function*/ bool(*faceDetector)(InputArray , OutputArray, void * ); }; // class Ptr<FacemarkNEW> FacemarkNEW::create(const FacemarkNEW::Config &conf){ return Ptr<FacemarkNEWImpl>(new FacemarkNEWImpl(conf)); } FacemarkNEWImpl::FacemarkNEWImpl( const FacemarkNEW::Config &conf ) : config( conf ) { // other initialization } bool FacemarkNEWImpl::addTrainingSample(InputArray image, InputArray landmarks){ // pre-process and save the new training sample return true; } void FacemarkNEWImpl::training(){ printf("training\n"); } bool FacemarkNEWImpl::fit( InputArray image, InputArray faces, InputOutputArray landmarks, void * runtime_params) { if(runtime_params!=0){ // do something based on the extra parameters } printf("fitting\n"); return 0; } void FacemarkNEWImpl::read( const cv::FileNode& fn ){ config.read( fn ); } void FacemarkNEWImpl::write( cv::FileStorage& fs ) const { config.write( fs ); } void FacemarkNEWImpl::loadModel(String filename){ // load the model } bool FacemarkNEWImpl::setFaceDetector(bool(*f)(InputArray , OutputArray, void * extra_params )){ faceDetector = f; isSetDetector = true; return true; } bool FacemarkNEWImpl::getFaces( InputArray image , OutputArray roi, void * extra_params){ if(!isSetDetector){ return false; } if(extra_params!=0){ //extract the extra parameters } std::vector<Rect> & faces = *(std::vector<Rect>*)roi.getObj(); faces.clear(); faceDetector(image.getMat(), faces, extra_params); return true; } } @endcode
编译代码
清除构建文件夹,然后重新构建整个库。请注意,您可以通过向cmake添加“-D BUILD_opencv_
处理额外参数 为了处理额外的参数,应该创建一个新的结构体来保存所有需要的参数。这是一个参数容器的示例
这是一个提取额外参数的代码片段
这是一个将额外参数传递到fit函数的示例
为了理解这个方案,这里有一个简单的示例,您可以尝试编译并查看其工作方式。
imgcodecs
和highgui
等重量级依赖项。