OpenCV实现物体的凸包检测的示例代码

目录
  • 1、 凸包
  • 2、寻找凸包:convexHull()函数
  • 3、函数解析之theRNG()
  • 4 、circle()函数【回忆】
  • 5、基础示例程序:凸包检测基础

1、 凸包

什么是凸包?

解释:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。

如下:用人手图来举例说明凸缺陷概念。手周围深色的线描画出凸包,A到H被标出的区域是凸包的各个“缺陷”,这些凸度缺陷提供了手以及手状态的特征表现的方法。

2、寻找凸包:convexHull()函数

说明:convexHull()函数用于寻找图像点集中的凸包。

void convexHull(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true)

第一个参数:输入的二维点集,可以填Mat类型或者std::vector

第二个参数:输出参数,函数调用后找到的凸包。

第三个参数:操作方向的标识符。当此标识符为True时,输出的凸包为顺时针方向。否则为逆时针方向。

第四个参数:操作标识符,默认值True。当标识符为真时,函数返回各个凸包的各个点。否则,它返回凸包各点的指数。

3、函数解析之theRNG()

函数说明:返回默认的随机数生成器。如果需要使用生成器获得一个随机数或者初始化一个数组,可以使用 randu 或者 randn代替。但想要在一个循环中产生很多随机数,那么使用此函数检索生成器,会很快。

RNG &rng = theRNG();  //用其引用来接收theRNG函数返回的随机数生成器(RNG就是随机数生成器的类)

4 、circle()函数【回忆】

void circle(CV_IN_OUT Mat& image, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8);

image:为图像,单通道多通道都行,不需要特殊要求

center:为画圆的圆心坐标

radius:为圆的半径

color:为设定圆的颜色,比如用CV_RGB(255, 0,0)设置为红色, CV_RGB(255,255,255)设置为白色,CV_RGB(0, 0,0)设置为黑色

thickness:为设置圆线条的粗细,值越大则线条越粗,为负数则是填充效果,-1表示绘制实心圆

lineType:表示线形。OpenCV中有三种可以选择LINE_4、LINE_8、LINE_AA。其中LINE_4表示采用4邻接的方式绘制,LINE_8表示采用8邻接的方式绘制,

LINE_AA表示高斯滤波抗锯齿。

5、基础示例程序:凸包检测基础

说明:随机生成3~103个坐标值随机的彩色点,然后将这些点连接起来

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
    //初始化变量和随机值
    Mat image(500, 500, CV_8UC3);
    RNG & rng = theRNG();
    while (1)
    {
        char key;
        int count = (unsigned)rng % 100 + 3;//随机生成点的数量
        cout << count << endl;
        vector<Point> points;//点值
        //随机生成点坐标
        for (int i = 0; i < count; i++)
        {
            Point point;
            point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);//uniform() 方法将随机生成下一个实数,它在[x,y]范围内。
            point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
            if(i<10)
                cout << "(" << point.x << "," << point.y << ")" << endl;
            points.push_back(point);//C++ vector::push_back 会先创建临时对象,然后将临时对象拷贝到容器中
        }
        //检测凸包
        vector<int> hull;
        convexHull(Mat(points), hull, true);
        //绘制出随机颜色的点
        image = Scalar::all(0);
        for (int i = 0; i < count; i++)
        {
            circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), FILLED,LINE_AA);
        }
        //准备参数
        int hullcount = (int)hull.size();//凸包边数
        Point point0 = points[hull[hullcount - 1]];//连接凸包边的坐标点
        //    cout << hull[0] <<":"<< hull.size()<<endl;
        //绘制凸包的边
        for (int i = 0; i < hullcount; i++)
        {
            Point point = points[hull[i]];
            line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);
            point0 = point;
        }
        imshow("凸包检测", image);
        key = (char)waitKey();
        if (key == 27 || key == 'q' || key == 'Q')
            break;
    }
    return 0;
}

到此这篇关于OpenCV实现物体的凸包检测的示例代码的文章就介绍到这了,更多相关OpenCV物体凸包检测内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python Graham求凸包问题并画图操作

    python Graham求凸包并画图 python写Graham没有c++那么好写,但是python画图简单.只需要用matplotlib里的pyplot,c++画图太难了. Graham算法写起来比较简单,只需要想办法对最小点和其他的点所连成的直线,与x轴正半轴的夹角进行排序,然后其他的就直接套用Graham算法模板就好了,因为c++可以重载排序函数sort,不用计算角度(用其他的数学方法),但是python不行(也许是我不知道而已,菜). python必须要在结构体里面加上角度这个变量,然

  • Python求凸包及多边形面积教程

    一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham's scan),时间复杂度为O(nlgn):Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h为凸包顶点的个数.这两种算法都按逆时针方向输出凸包顶点. Graham扫描法 用一个栈来解决凸包问题,点集Q中每个点都会进栈一次,不符合条件的点会被弹出,算法终止时,栈中的点就是凸包的顶点(逆时针顺序在边界上). 算法步骤如下图: import sys import math import time

  • 基于python 凸包问题的解决

    最近在看python的算法书,之前在年前买的书,一直在工作间隙的时候,学习充电,终于看到这本书,但是确实又有点难,感觉作者写的代码太炫技 了,有时候注释也不怎么能看懂,终于想到一个方法,就是里面说的算法问题,我就百度python解决他,觉得这个挺好. 下面是凸包问题的一个代码. # -*- coding: utf-8 -*- import turtle import random import time f=open('point.txt','w') for i in range(100): x

  • python 生成任意形状的凸包图代码

    一.效果图: 在左图的白色区域周围,画任意形状的凸包图. 二.代码 import cv2 import numpy as np def generate_poly(image, n, area_thresh): """ 随机生成凸包 :param image: 二值图 :param n: 顶点个数 :param area_thresh: 删除小于此面积阈值的凸包 :return: 凸包图 """ row, col = np.where(image

  • OpenCV凸包检测和凸缺陷学习示例

    目录 1.凸包检测与凸缺陷定义 2.opencv相关实现函数 3.代码实践 4.总结 1.凸包检测与凸缺陷定义 凸包是将最外层的点连接起来构成的凸多边形,它能包含点击中所有的点.物体的凸包检测常应用在物体识别.手势识别及边界检测等领域. 凸包检测常常用在轮廓分析之后.对二值图像进行轮廓分析之后,可以构建每个轮廓的凸包,构建完成之后会返回该凸包包含的点集.根据返回的凸包点集可以绘制该轮廓对应的凸包.一般来说,凸性曲线总是凸出来的,至少是平的.如果有地方凹进去了就被叫做凸性缺陷. 下图可以更加直接的

  • OpenCV-Python实现凸包的获取

    前言 逼近多边形是某个图像轮廓的高度近似,而凸包的提出是为了简化逼近多边形的.其实,凸包跟逼近多边形很像,只不过它是物体最外层的"凸"多边形. 简单的概括,凸包是指完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形.凸包的特点是每一处都是凸的,即在凸包内连接任意两点的直线都在凸包的内部,并且任意连续3个点的内角小于180度. 在OpenCV中,它给我们提供cv2.convexHull()来获取轮廓的凸包.其完整定义如下: def convexHull(points, hull=None

  • OpenCV实现物体的凸包检测的示例代码

    目录 1. 凸包 2.寻找凸包:convexHull()函数 3.函数解析之theRNG() 4 .circle()函数[回忆] 5.基础示例程序:凸包检测基础 1. 凸包 什么是凸包? 解释:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点. 如下:用人手图来举例说明凸缺陷概念.手周围深色的线描画出凸包,A到H被标出的区域是凸包的各个“缺陷”,这些凸度缺陷提供了手以及手状态的特征表现的方法. 2.寻找凸包:convexHull()函数 说明:convexH

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

  • Android中的人脸检测的示例代码(静态和动态)

    (1)背景. Google 于2006年8月收购Neven Vision 公司 (该公司拥有10多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并加入到android中.Android 中的人脸识别技术,用到的底层库:android/external/neven/,framework 层:frameworks/base/media/java/android/media/FaceDetector.java. Java 层接口的限制:A,只能接受Bitmap 格式的数据:B,只能

  • python+opencv3.4.0 实现HOG+SVM行人检测的示例代码

    参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果. 网址 :https://docs.opencv.org/3.4.0/d5/d77/train_HOG_8cpp-example.html opencv版本:3.4.0 训练集和opencv官方用了同一个,可以从http://pascal.inrialpes.fr/data/human/下载,在网页的最下方"here(970MB处)",用迅雷下载比较快(500kB/s).训练集文件比较

  • python+opencv+caffe+摄像头做目标检测的实例代码

    首先之前已经成功的使用Python做图像的目标检测,这回因为项目最终是需要用摄像头的, 所以实现摄像头获取图像,并且用Python调用CAFFE接口来实现目标识别 首先是摄像头请选择支持Linux万能驱动兼容V4L2的摄像头, 因为之前用学ARM的时候使用的Smart210,我已经确认我的摄像头是支持的, 我把摄像头插上之後自然就在 /dev 目录下看到多了一个video0的文件, 这个就是摄像头的设备文件了,所以我就没有额外处理驱动的部分 一.检测环境 再来在开始前因为之前按着国嵌的指导手册安

  • 使用OpenCV实现人脸图像卡通化的示例代码

    引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视觉和机器学习的开源 python 库.它主要针对实时计算机视觉和图像处理.它用于对图像执行不同的操作,这些操作使用不同的技术对图像进行转换.在本文中,我们将实现使用OpenCV将人脸图像卡通化. 让我们从导入必需的库开始! import cv2 import numpy as np 第一次变换(卡通化) 在这个转换中,我们将找到图像的边缘,并使用双边滤波器和位操作符制作一个卡通化的图像. # Reading the Image i

  • C++ OpenCV实现灰度图蒙版GrayMask的示例代码

    目录 需求说明 具体流程 功能函数 C++测试代码 测试效果 需求说明 在对图像进行处理时,经常会有这类需求:想对感兴趣区域进行掩膜处理,只操作掩膜内数据,此时需要搭配掩膜绘制功能,并在绘制过程中希望能区分掩膜区和非掩膜区:除了掩膜本身的线条以外,还希望掩膜内图像是原色,掩膜外图像的颜色进行一定调整:通常可以采用图像透明化或者色彩单通道加深的方式实现. 比如对三通道的图像,可以将掩膜外数据的红通道数值提高,此时该部分图像就会偏红色,如下图1所示. 图1 颜色加深的蒙版效果 但是针对灰度图,因为图

  • 基于FLink实现实时安全检测的示例代码

    目录 研发背景 场景描述 组件版本 日志结构 技术方案 关键代码 主入口类 mapper算子 filter算子 keyBy算子 窗口函数(核心代码) 最后一次map算子 ElasticSearch工具类 事件实体类 消息实体类 研发背景 公司安全部目前针对内部系统的网络访问日志的安全审计,大部分都是T+1时效,每日当天,启动Python编写的定时任务,完成昨日的日志审计和检测,定时任务运行完成后,统一进行企业微信告警推送.这种方案在目前的网络环境和人员规模下,呈现两个痛点,一是面对日益频繁的网络

  • Android动态人脸检测的示例代码(脸数可调)

    人脸检测 这里的人脸检测并非人脸识别,但是却可以识别出是否有人,当有人时候,你可以将帧图进行人脸识别(这里推荐Face++的sdk),当然我写的demo中没有加入人脸识别,有兴趣的朋友可以追加.face++ android自带的人脸检测 这里我们用到了人脸检测类为 FaceDetector.这个类提供了强大的人脸检测功能,可以方便我们进行人脸的侦测,因此我们使用他来进行动态的人脸检测,实现原理,其实也挺简单,主要是通过Carmen的回调PreviewCallback 在其中对帧图进行操作,并通过

  • Python+OpenCV实现实时眼动追踪的示例代码

    使用Python+OpenCV实现实时眼动追踪,不需要高端硬件简单摄像头即可实现,效果图如下所示. 项目演示参见:https://www.bilibili.com/video/av75181965/ 项目主程序如下: import sys import cv2 import numpy as np import process from PyQt5.QtCore import QTimer from PyQt5.QtWidgets import QApplication, QMainWindow

随机推荐