opencv添加的新接口clearVec()的实现

自己编译的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博客

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值