OpenCV findTours函数主要用以寻找图像中物体的轮廓,其原型如下:
indTours 函数参数:
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;
试运行,结果如下: