OpenCV的findTours函数的原型如下:
函数参数:
Image 输入图像,需8位单通道图像。非零像素被视为1。零像素保持为0,因 此图 像被视为二进制。您可以使用compare、inRange、threshold、adaptiveThreshold、Canny等从灰度或彩色图像中创建二值图像。如果模式等于RETR_CCOMP或RETR_FLOODILL,则输入也可以是32位整数图像(CV_32SC1)。
Conturs 检测到的轮廓。每个轮廓都存储为点的向量(例如std::vector<std::vector<cv::Point>>)。
Hierarchy 可选输出向量(例如std::vector<cv::Vec4i>),包含有关图像拓扑的信息。它的元素数量与轮廓的数量一样多。对于每个第i个轮廓[i],元素层次[i][0]、层次[i][1]、层次[i][2]和层次[i][3]分别设置为相同层次级别的下一个和前一个轮廓、第一个子轮廓和父轮廓的轮廓中基于0的索引。如果轮廓i没有下一个、上一个、父轮廓或嵌套轮廓,则层次[i]的相应元素将为负。
method 轮廓近似法,有以下几种:
offset 每个轮廓点偏移的可选偏移量。如果轮廓是从图像ROI中提取的,然后应该在整个图像上下文中进行分析,那么这就很有用。
用法示例:
新建一个对话框程序,在程序中加入如下代码:
#include<sstream>
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("1.jpg");
cout << src.type() << "\t"<< src.channels() << "\t" << src.rows << "\t" << src.cols <<endl;
//imshow("Input Image", src);
Mat src1;
cvtColor(src, src1, COLOR_RGBA2GRAY);
Mat erodeimg;
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(src1,erodeimg,kernel);
Mat blurimg;
medianBlur(erodeimg, blurimg, 33);
Mat threimg;
threshold(blurimg, threimg, 80, 255, THRESH_BINARY);
imshow("threshold result", threimg);
vector<vector<Point>> conturs;
vector<Vec4i> hierarchy;
Mat res = Mat::zeros(src.size(),CV_8UC3);
findContours(threimg, conturs, hierarchy,RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
//findContours(threimg, conturs, NULL, CHAIN_APPROX_SIMPLE);
if (conturs.size() == 0)
{
cout << "No objiect is found\n\t";
}
else
cout << conturs.size() << endl;
RNG rng(0xFFFFFFFF);
for (size_t i = 0; i < conturs.size(); i++)
{
drawContours(res, conturs, i, Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),-1);
//drawContours(src, conturs, i, Scalar(255,0,0));
drawContours(src, conturs, i, Scalar(1));
}
imshow("Result", res);
imshow("Result1", src);
waitKey(0);
}
试运行结果如下:
该示例程序的源码已上传到CSDN,下载链接为:https://download.csdn.net/download/billliu66/89735238