opencv:图像轮廓计算

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
RNG rng(12345);
int main(int argc, char** argv)
{
     Mat src = imread("f:/images/qq/20200215213837.png");
    //Mat src = imread("f:/images/qq/yezi.png");
    if (src.empty())
    {
        printf("Could not find the image!\n");
        return -1;
    }
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", src);
    // 做一个高斯模糊,消除一些细微的东西
    GaussianBlur(src, src, Size(3, 3), 0);
    GaussianBlur(src, src, Size(3, 3), 0);
    Mat gray, binary;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    imshow("gray", gray);
    // 二值化
    threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
    imshow("binary", binary);
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    //findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
    // 只绘制最外层的轮廓
    findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
    // 一个一个绘制
    for (size_t t = 0; t < contours.size(); t++) {
        double area = contourArea(contours[t]);
        double len = arcLength(contours[t], true);
        printf("#%d === area: %.2f, length: %.2f\n", t, area, len);
        // 可以在这里过滤较小的面积或周长的轮廓, 2改为-1,就是填充这个轮廓
        drawContours(src, contours, t, Scalar(0, 0, 255), 1, 8);
        Rect box = boundingRect(contours[t]);
        rectangle(src, box, Scalar(255, 0, 0), 1, 8);
        // 最小外接矩形矩形
        Point2f pts[4];
        RotatedRect rrt = minAreaRect(contours[t]);
        rrt.points(pts);
        for (int i = 0; i < 4; i++) {
            line(src, pts[i], pts[(i+1)%4], Scalar(0, 255, 255), 1, 8);
        }
        // 绘制外接椭圆
        ellipse(src, rrt, Scalar(255, 255, 0), 1, 8);
    }
    // -1代表绘制所有
    //drawContours(src, contours, -1, Scalar(0, 0, 255), 2, 8);
    imshow("result", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}
opencv:图像轮廓计算的更多相关文章
- OpenCV图像轮廓检测
		轮廓检测: 轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 一.关键函数1.1 cvFindContours函数功能:对图像进行轮廓检测,这个函数将 ... 
- opencv 图像轮廓
		图片解析: 原图: code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\c ... 
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
		常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ... 
- OpenCV图像的轮廓的匹配
		http://blog.sina.com.cn/s/blog_67a7426a0101cxl0.html 一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮 ... 
- opencv 6 图像轮廓与图像分割修复 3 图像的矩,分水岭,图像修补
		图像的矩 矩的计算:moments()函数 计算轮廓面积:contourArea()函数 #include "opencv2/highgui/highgui.hpp" #inclu ... 
- OpenCV计算机视觉学习(8)——图像轮廓处理(轮廓绘制,轮廓检索,轮廓填充,轮廓近似)
		如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 1, ... 
- OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)
		一.Canny边缘检测 Canny边缘检测是一系列方法综合的结果.其中主要包含以下步骤: 1.使用高斯滤波器,平滑图像,滤除噪声. 2.计算图像中每个像素点的梯度强度和方向. 3.应用非极大值抑制(N ... 
- opencv:  轮廓提取;
		一般轮廓提取是通过对图像的梯度进行卷积计算,得到图像边缘(滤波),常用的边缘检测方法有candy.sobel. Laplacian等,再对二值化后的边缘图像进行轮廓计算: 1.Candy算子: cv: ... 
- OpenCV3入门(十)图像轮廓
		1.图像轮廓 1.1图像轮廓与API函数 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形,相对于边缘,轮廓是连续的,边缘并不全部连续.一般地,获取图像轮廓要经过下面几个步骤: 1) 读取 ... 
随机推荐
- MPI Maelstrom POJ - 1502   floyd
			#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> usin ... 
- ansible笔记(15):循环(二)with_items/with_list/with_together/with_flattened
			嵌套的列表(序列中的序列),示例如下: --- - hosts: 192.168.10.2 remote_user: root gather_facts: no tasks: - debug: msg ... 
- Date/Math/String对象的函数
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
- Docker学习(六)Dockerfile构建自定义镜像
			Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ... 
- 使用shader,矩阵旋转实现图片的旋转动画
			常用于loading动画之类的 具体的实现代码: fixed4 frag (v2f i) : SV_Target { //1.先将uv平移到原点(让图片中心与原点重合) float2 pianyi=( ... 
- tkinter页面卡死
			tkinter界面卡死的解决办法 1.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, ... 
- Js 事件委托 解决动态元素不能click点击的问题
			参考教程地址 https://blog.csdn.net/xiaolong20081/article/details/79792137 不想写了.直接看上面就行 采用事件委托或代理方式绑定 $(doc ... 
- java-日期取特定值
			import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author G ... 
- Linux 配置mysql 远程连接
			1.首先用root用户登录mysql mysql -u root -p 2.新建用户 use mysql; select host,user from user;(查看现有用户) CREATE USE ... 
- sql查询 —— 模糊查询
			--模糊查询 --like --%至少替换一个 -- _只替换一个 -- 查姓李的人 select *from student name like "李%"; -- 查名为杰伦的人 ... 
