opencv的一些函数——contours
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv的一些函数——contours相关的知识,希望对你有一定的参考价值。
参考技术Aimage, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point());
findContours( InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point());
检测轮廓方法(mod):
表示一条轮廓的方法(method):
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
函数参数详解:
1、获取包围对象的垂直矩阵
2、获取包围对象的最小圆
3、获取包围对象的多边形
4、获得包围对象的凸包
原理
5、轮廓中的所有点
一个想法:先取得轮廓,然后新建一个图像,在新图像上画出轮廓以及填充的图像,遍历这幅图像,如果有颜色就是在轮廓内。
另一个方法1
另一个方法2
6、最小面积的外接矩形(可倾斜)
minAreaRect(InputArray points);
7、可倾斜椭圆(见上)
fitEllipse(InputArray points);
8、轮廓内连通区域的面积和长度
double contourArea(InputArray contour, bool oriented=false )
double arcLength(InputArray curve, bool closed);
9、判断一个点是否在一个多边形内
pointPolygonTest
double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)
用于测试一个点是否在多边形中
当measureDist设置为true时,若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。
当measureDist设置为false时,若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上。
10、比较两个形状的相似性
原理: OpenCV提供的一个根据计算比较两张图像Hu不变距的函数,函数返回值代表相似度大小,完全相同的图像返回值是0,返回值最大是1。这可以用在在一堆照片中搜索出两张相同或相同程度最大的图像。
double cvMatchShapes(const void * object1, const void * object2, int method, double parameter = 0);
使用 Contour Area-OpenCV 时出现断言错误
【中文标题】使用 Contour Area-OpenCV 时出现断言错误【英文标题】:Assertion Error when using Contour Area-OpenCV 【发布时间】:2016-06-23 02:44:26 【问题描述】:每当我在 openCV 中使用 contourArea 函数时都会出现此错误
这是我的代码
while (true)
Mat imgOriginal;
bool bSuccess = cap.read(imgOriginal); // read a new frame from video
if (!bSuccess) //if not success, break loop
cout << "Cannot read a frame from video stream" << endl;
break;
Mat imgHSV;
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
Mat imgThresholded;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
//morphological opening (removes small objects from the foreground)
erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
//morphological closing (removes small holes from the foreground)
dilate(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
int thresh = 100;
Mat canny_output;
vector<Vec4i> hierarchy;
vector<vector<Point> > contours;
RNG rng(12345);
Canny(imgThresholded, canny_output, thresh, thresh * 2, 3);
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Draw contours
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
double area = contourArea(contours);
std::cout << area;
imshow("contours", drawing);
在此之前,我的代码大部分工作正常,但我抓住轮廓区域非常重要,但它一直给我这个错误。 非常感谢任何帮助
【问题讨论】:
放入for循环double area = contourArea(contours[i]);
【参考方案1】:
cv::contourArea()
采用单个轮廓并返回该轮廓的面积,因为在您的情况下 contours
是一个轮廓列表,其中可能包含 0 个或多个轮廓,因此您明确需要访问一个轮廓使用下标为:
if (contours.size() > 0)
for (int i=0; i<contours.size(); i++)
std::cout << "Contour id : " << i << ", area = " << cv::contourArea(contours[i]) << std::endl;
else
std::cout << "No contours found !" << std::endl;
【讨论】:
您可以安全地避开if
,因为支票已经在for
中
是的,但它只是在else
语句中打印出一些错误,我会对其进行编辑以使其更清晰。以上是关于opencv的一些函数——contours的主要内容,如果未能解决你的问题,请参考以下文章