但是运行后报错:terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.5.0) /home/sniper/Downloads/opencv-4.5.0/modules/imgproc/src/contours.cpp:1799: error: (-215:Assertion failed) (_contours.kind() == _InputArray::STD_VECTOR_VECTOR || _contours.kind() == _InputArray::STD_VECTOR_MAT || _contours.kind() == _InputArray::STD_VECTOR_UMAT) in function 'findContours'
时间: 2024-04-21 10:26:08 浏览: 214
C程序设计教学课件:CHAPTER13EXCEPTIONHANDLING.pptx
这个错误通常是由于传递给 `findContours()` 函数的轮廓参数类型不正确导致的。
在你的代码中,`findContours()` 函数的第一个参数是一个 `cv::Mat` 类型的矩阵,而第二个参数 `intersectionPolygon` 是一个 `std::vector<cv::Point>` 类型的向量。这里的问题是,`findContours()` 函数期望的第二个参数是一个用于存储轮廓的输出向量,而你传递了一个点的向量。因此,你需要将 `intersectionPolygon` 声明为一个 `std::vector<std::vector<cv::Point>>` 类型的向量,以存储轮廓。
更改后的代码如下所示:
```
bool isPolygonInside(const std::vector<cv::Point>& polygon1, const std::vector<cv::Point>& polygon2, double& outsideArea) {
// Check if all vertices of polygon1 are inside polygon2
bool allInside = true;
for (const auto& vertex : polygon1) {
double distance = cv::pointPolygonTest(polygon2, vertex, true);
if (distance < 0) {
allInside = false;
break;
}
}
if (allInside) {
return true;
}
// Polygon1 is partially or completely outside polygon2
std::vector<std::vector<cv::Point>> intersectionPolygon; // 修改此处
if (cv::isContourConvex(polygon1) && cv::isContourConvex(polygon2)) {
cv::Mat intersectionMat;
cv::intersectConvexConvex(cv::Mat(polygon1), cv::Mat(polygon2), intersectionMat);
if (cv::countNonZero(intersectionMat) > 0) {
cv::findContours(intersectionMat, intersectionPolygon, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
}
} else {
std::vector<cv::Point> hull1, hull2;
cv::convexHull(polygon1, hull1);
cv::convexHull(polygon2, hull2);
std::vector<cv::Point> hullIntersection;
cv::convexHull(hull1, hullIntersection, false, false);
cv::fillConvexPoly(cv::Mat(hullIntersection), hull2, cv::Scalar(0), false);
cv::findContours(cv::Mat(hullIntersection), intersectionPolygon, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
}
if (intersectionPolygon.empty()) {
outsideArea = 0;
return false;
}
double intersectionArea = std::abs(cv::contourArea(intersectionPolygon[0])); // 修改此处
double polygon1Area = std::abs(cv::contourArea(polygon1));
outsideArea = polygon1Area - intersectionArea;
return true; // 修改此处
}
```
你需要将 `intersectionPolygon` 的类型从 `std::vector<cv::Point>` 改为 `std::vector<std::vector<cv::Point>>`,以及在计算交集面积时使用 `intersectionPolygon[0]` 来获取轮廓。
另外,最后一行需要返回 true,因为在计算出多边形1在多边形2外部的面积后,函数应该返回 true。
阅读全文