contour = sorted(contour, key = cv2.contourArea, reverse=True)#对一系列轮廓点坐标按它们围成的区域面积进行排序 cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\shapedescr.cpp:315: error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::contourArea'是什么情况
时间: 2023-08-11 12:29:23 浏览: 104
这个错误是由于cv2.contourArea() 函数使用了错误的参数或参数类型而引起的。该函数的第一个参数应该是一个轮廓点坐标的numpy数组,第二个参数应该是可选的,通常是False。在该函数中出现问题的原因可能是轮廓点坐标数组的格式不正确,或者是该数组为空或未定义。
您可以检查一下传递给cv2.contourArea()函数的输入参数是否正确,并且确保输入参数包含正确的轮廓点坐标。如果输入参数正确,您还可以检查一下OpenCV版本是否正确,或者尝试卸载并重新安装OpenCV。
相关问题
用c++ opencv实现python的sorted_cnt = sorted(contours, key=cv2.contourArea, reverse = True)
在C++中,可以使用以下代码实现与Python中sorted函数中的key参数类似的功能:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace cv;
using namespace std;
bool compareContourAreas(vector<Point> contour1, vector<Point> contour2) {
double i = fabs(contourArea(Mat(contour1)));
double j = fabs(contourArea(Mat(contour2)));
return (i > j);
}
int main() {
vector<vector<Point>> contours; // 存储轮廓
vector<Vec4i> hierarchy; // 存储轮廓的拓扑结构
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
findContours(image, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
sort(contours.begin(), contours.end(), compareContourAreas); // 排序
return 0;
}
```
在这个例子中,我们定义了一个名为compareContourAreas的函数,该函数接受两个轮廓作为参数,并返回一个布尔值。在该函数中,我们使用cv::contourArea函数计算每个轮廓的面积,并将它们的绝对值作为比较的依据。
最后,我们使用sort函数对轮廓进行排序,并传递compareContourAreas函数作为参数,以确保按面积大小的倒序排列。
需要注意的是,在C++中,没有直接的reverse参数,我们需要自己实现compareContourAreas函数来实现类似的功能。
我运行车牌识别的代码中contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]这一行出了TypeError: Required argument 'contour' (pos 1) not found这样的问题,该怎么解决
这个错误提示说明该行代码中的 `contours` 参数没有被正确传递或者没有被定义。你可以检查一下代码中是否已经定义了 `contours` 变量,或者在调用 `sorted()` 函数时是否正确传递了 `contours` 参数。
另外,你也可以尝试使用 `cv2.findContours()` 函数来获取轮廓,例如:
```
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
```
这样做可以确保 `contours` 变量被正确定义并传递到 `sorted()` 函数中。
阅读全文