自己编译的opencv,之前文章有说添加了这个接口,也有上传3.3.0版本添加这个接口之后编译好的库,但是没有把实现过程展现出来,导致有些朋友问我如何实现的,今天把这个实现放出来,实现就是个简单的调用而已
自己添加的clearVec()接口,用于清除vector类型的列表。因为在外部调用opencv有的接口时,其传出了vector列表,传出的这个列表是在opencv中分配的内存,如果外部程序不预处理,则在其析构时会导致程序崩溃,所以这个列表也必需放在opencv中来清除。
这个接口不分opencv版本。
在头文件 modules\imgproc\include\opencv2\imgproc.hpp 中添加如下接口的声明:
/*
delete all the vector things
by Ligo, 2018.7.30
reference:
https://blog.csdn.net/liyuanbhu/article/details/50363670
https://blog.csdn.net/zhengudaoer/article/details/73796261
*/
template<typename _Tp>
CV_EXPORTS_W void clearVec(std::vector<_Tp> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<int> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point2i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point2l> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point2f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point2d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point2i>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point2l>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point2f>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point2d>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point3i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point3f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Point3d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point3i>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point3f>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Point3d>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Rect> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Rect2i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Rect2f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Rect2d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Rect>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Rect2i>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Rect2f>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<std::vector<Rect2d>> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Moments> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2b> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3b> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4b> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2s> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3s> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4s> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2w> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3w> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4w> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec6i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec8i> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec6f> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec2d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec3d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec4d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<Vec6d> &vecs);
template CV_EXPORTS_W void clearVec(std::vector<KeyPoint> &vecs);
我添加的位置是在 getTextSize() 接口之后,LineIterator 类前面的注释之前。注意这个数据类型的列表,有可能不全,如果还有新的数据类型,应该全部加上来,当然如果有哪位朋友发现漏了哪个类型的列表,希望在下面留言,以便我也及时更新上来。
在文件 modules\imgproc\src\contours.cpp 的结尾位置添加接口的实现:
template<typename _Tp>
void cv::clearVec(std::vector<_Tp> &vecs)
{
vecs.clear();
vecs.resize(0);
vecs.shrink_to_fit();
}
添加完之后重新编译编译即可.
2022.4.12:
早前添加此接口的背景,以及接口的使用测试:opencv传出vector的参数在析构时挂掉的处理_red-fly的博客-CSDN博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)