基于OpenCV的轮廓的检测与绘制

项目基本框架:
输入图像-》预处理-》输出图像

输入图像:imread()
预处理:
(1)转为灰度图
(2)平滑滤波(中值滤波、均值滤波、高斯滤波)
(3)二值化(阈值化)(OTSU大律法自适应二值化、TRIANGLE三角形法自适应二值化)
(4)发现轮廓(findContours())
(5)绘制轮廓
(6)输出轮廓结构描述

输出图像:imshow()

结果:

基于OpenCV的轮廓的检测与绘制_第1张图片

 源码:

// MyContours.cpp : 定义控制台应用程序的入口点。
//轮廓检测与绘制

#include "stdafx.h"
#include 
#include 
using namespace std;
using namespace cv;

int main()
{
	system("color F1");
	Mat img = imread("E:\\study\\OpenCV\\picture\\12.jpg");
	if (!img.data) {
		cout << "图像载入异常" << endl;
		system("pause");
		return -1;

	}	
	namedWindow("原图", WINDOW_NORMAL);

	imshow("原图", img);
	Mat gray, binary;

	//(1)转灰度图
	cvtColor(img, gray, COLOR_BGR2GRAY);

	//滤波处理(高斯滤波)
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);
	
	//大律法自适应二值化
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);

	//发现轮廓
	vector> contours;//轮廓
	vectorhierarchy;//存放轮廓的结构变量
	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//绘制轮廓
	for (int t = 0; t < contours.size(); t++) {
		drawContours(img, contours, t, Scalar(0, 0, 255), 2, 8);
	}
	//输出轮廓结构描述
	for (int i = 0; i < hierarchy.size(); i++) {
		cout << hierarchy[i] << endl;
	}
	namedWindow("binary", WINDOW_NORMAL);
	imshow("binary", binary);

	namedWindow("gray", WINDOW_NORMAL);
	imshow("gray", gray);

	namedWindow("轮廓检测结果", WINDOW_NORMAL);
	imshow("轮廓检测结果", img);
	waitKey(0);

	return 0;
}

你可能感兴趣的:(图像处理,opencv,计算机视觉,人工智能)