凸包(Convex Hull)是一个计算几何(图形学)中的概念,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。
X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。常见的有Graham’s Scan法和Jarvis步进法。
函数说明:
void cv::convexHull ( InputArray points,
OutputArray hull,
bool clockwise = false,
bool returnPoints = true
)
points:输入的二维点集,Mat类型数据即可
hull:输出参数,用于输出函数调用后找到的凸包
clockwise:操作方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向。
returnPoints:操作标识符,默认值为true,此时返回各凸包的各个点,否则返回凸包各点的指数,当输出数组时std::vector时,此标识被忽略。
代码:
JNIEXPORT void JNICALL
Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv *, jobject, jlong addrGray,
jlong addrRgba) {
Mat &mGr = *(Mat *) addrGray;
Mat &mRgb = *(Mat *) addrRgba;
vector<KeyPoint> v;
looperAddNum++;
if (looperAddNum > 60) {
looperAddNum = 0;
if (looperIndexNum < 100)
looperIndexNum += 1;
}
blur(mGr, mGr, Size(3, 3));
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
threshold(mGr, threshold_output, 100, 255, THRESH_BINARY);
findContours(threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE,
Point(0, 0));
vector<vector<Point> > hull(contours.size());
for (size_t i = 0; i < contours.size(); i++) {
convexHull(Mat(contours[i]), hull[i], false);
}
Mat drawing = Mat::zeros(threshold_output.size(), mRgb.type());
for (size_t i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, (int) i, color, 1, 8, hierarchy, 0, Point());//vector<Vec4i>()
drawContours(drawing, hull, (int) i, color, 1, 8, hierarchy, 0, Point());
}
mRgb = drawing;
LOGI("index %d", looperIndexNum);
}