findContour函数,用于在二值图像中查找轮廓。
查找轮廓API:
void findContours(InputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point()
)
参数解析:
//InputArray mage:输入CV_8UC1的图像(像素值被归一化成binary)。如果int mode等于RETR_CCOMP或RETR_FLOODFILL则可以输入CV_32SC1的图像;
//OutputArrayOfArrays contours:检测到的轮廓,每个轮廓都存储为点的向量(vector
//OutputArray hierarchy:输出向量(vector
//int mode:轮廓查找模式;
//int method:指定轮廓的近似方法,即指定在轮廓点集中保留哪些点。
//Point offset = Point():每个轮廓点移动的可选偏移。
绘制轮廓API:
void drawContours(InputOutputArray image,
InputArrayOfArrays contours,
int contourIdx,
const Scalar &color,
int thickness = 1,
int lineType = LINE_8,
InputArray hierarcy = noArray(),
int maxLevel = INT_MAX,
Point offset = Point()
)
参数解析:
//InputOutputArray image:目标图像;
//InputArrayOfArrays contours:所有输入的轮廓,每个轮廓都存储为一个点矢量;
//int contourIdx:表示要绘画哪一个轮廓。如果为负数,则绘制所有轮廓;
//const Scalar &color:轮廓的颜色;
//int thickness = 1:绘制轮廓线的粗细,如果为负数,则填充整个轮廓;
//int lineType = LINE_8:轮廓线的类型;
//InputArray hierarcy = noArray():有关层次结构的可选信息(仅当您只想绘制某些轮廓时才需要
//int maxLevel = INT_MAX:Maxmal level for drawn contours.(仅当有可用的层次结构时,才会考虑此参数)
如果为 0,则仅绘制指定的轮廓;
如果为 1,则该函数绘制轮廓和所有嵌套轮廓;
如果为 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等;
//Point offset = Point():每个轮廓点移动的可选偏移。
代码演示:
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("C:/picture/source.jpg");
if (src.empty())
{
std::cout << "Could not load image!";
return -1;
}
blur(src, src, Size(5, 5));
Mat edgeImg;
int thresholdValue=35;
Canny(src, edgeImg, thresholdValue, thresholdValue * 2, 3, false);
imshow("edgeImg", edgeImg);
vector>contours;
vectorhierarchy;
findContours(edgeImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
drawContours(src, contours, -1,Scalar(0,0,255), 2, LINE_8);
imshow("src", src);
waitKey(0);
return 0;
}