精华内容
下载资源
问答
  • Opencv 轮廓提取

    万次阅读 2019-01-27 23:38:06
    检测——选出边缘点 方法一 Canny算法 特点:轮廓细腻 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; //边....

    边缘检测的一般步骤

    • 滤波——消除噪声
    • 增强——使边界轮廓更加明显
    • 检测——选出边缘点

    方法一

    Canny算法
    特点:轮廓细腻

    #include<opencv2\opencv.hpp>   
    #include<opencv2\highgui\highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    //边缘检测
    int main()
    {
    	Mat img = imread("1.jpg");
    	imshow("原始图", img);
    
    	Mat DstPic, edge, grayImage;
    
    	//创建与src同类型和同大小的矩阵
    	DstPic.create(img.size(), img.type());
    
    	//将原始图转化为灰度图
    	cvtColor(img, grayImage, COLOR_BGR2GRAY);
    
    	//先使用3*3内核来降噪
    	blur(grayImage, edge, Size(3, 3));
    
    	//运行canny算子
    	Canny(edge, edge, 3, 9, 3);
    
    	imshow("Canny算法轮廓提取效果", edge);
    
    	waitKey(0);
    }
    

    在这里插入图片描述

    方法二

    Sobel算法

    #include<opencv2\opencv.hpp>   
    #include<opencv2\highgui\highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    //边缘检测
    int main()
    {
    	Mat img = imread("1.jpg");
    
    	imshow("原始图", img);
    
    	Mat grad_x, grad_y;
    	Mat abs_grad_x, abs_grad_y, dst;
    
    	//求x方向梯度
    	Sobel(img, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
    	convertScaleAbs(grad_x, abs_grad_x);
    	imshow("x方向soble", abs_grad_x);
    
    	//求y方向梯度
    	Sobel(img, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
    	convertScaleAbs(grad_y, abs_grad_y);
    	imshow("y向soble", abs_grad_y);
    
    	//合并梯度
    	addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
    	imshow("Sobel算法轮廓提取效果", dst);
    
    	waitKey(0);
    }
    

    在这里插入图片描述

    方法三

    Laplacian算法

    #include<opencv2\opencv.hpp>   
    #include<opencv2\highgui\highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    //边缘检测
    int main()
    {
    	Mat img = imread("1.jpg");
    	imshow("原始图", img);
    	Mat gray, dst, abs_dst;
    	//高斯滤波消除噪声
    	GaussianBlur(img, img, Size(3, 3), 0, 0, BORDER_DEFAULT);
    	//转换为灰度图
    	cvtColor(img, gray, COLOR_RGB2GRAY);
    	//使用Laplace函数
    	//第三个参数:目标图像深度;第四个参数:滤波器孔径尺寸;第五个参数:比例因子;第六个参数:表示结果存入目标图
    	Laplacian(gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
    	//计算绝对值,并将结果转为8位
    	convertScaleAbs(dst, abs_dst);
    	imshow("Laplace算法轮廓提取效果", abs_dst);
    	
    	waitKey(0);
    }
    

    在这里插入图片描述

    展开全文
  • opencv python边缘检测和轮廓提取

    千次阅读 2021-01-11 23:09:41
    opencv中的边缘检测和轮廓提取都是图像识别的重要部分 提示:以下是本篇文章正文内容,下面案例可供参考 一、边缘检测 Canny边缘检测算子是一个多级边缘检测算法,Canny的目标是找到一个最优的边缘检测算法,其评价...


    前言

    opencv中的边缘检测和轮廓提取都是图像识别的重要部分


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、边缘检测

    Canny边缘检测算子是一个多级边缘检测算法,Canny的目标是找到一个最优的边缘检测算法,其评价标准为:低错误率、高定位性、最小响应。

    Canny边缘检测步骤
    Canny函数
    Python:
    edges = cv.Canny( image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]] )
    image 源图像,需是单通道8位图像
    edges 输出的边缘图像,需和源图像具有一样的大小和类型
    threshold1 第一个滞后性阀值,double
    threshold2 第二个滞后性阀值,double
    apertureSize 应用Sobel算子孔径大小,默认值:3
    L2gradient a flag, indicating whether a more accurate L 2 norm =(dI/dx) 2 +(dI/dy) 2 − − − − − − − − − − − − − − − − √ should be used to calculate the image gradient magnitude ( L2gradient=true ), or whether the default L 1 norm =|dI/dx|+|dI/dy| is enough ( L2gradient=false ).

    import cv2 as cv
    import numpy as np
    
    
    def edge_demo(image):
        blurred = cv.GaussianBlur(image, (3, 3), 0)  # 高斯模糊
        gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)  # 灰路图像
        xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)  # xGrodient
        ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)  # yGrodient
        edge_output = cv.Canny(xgrad, ygrad, 100, 150)  # edge
        cv.imshow("Canny Edge",edge_output)
    
        # #  彩色边缘
        # dst = cv.bitwise_and(image, image, mask=edge_output)
        # cv.imshow("Color Edge", dst)
    
    
    src=cv.imread("D:\\1111.png")
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
    cv.imshow("input image",src)
    edge_demo(src)
    cv.waitKey(0)
    
    
    cv.destroyAllWindows()
    
    

    二、轮廓提取

    1.非边缘检测轮廓提取

    先将图片进行高斯模糊,然后变成灰路图像,再将图片二值化,最后将图片进行轮廓提取。

    代码如下(示例):
    这个方法有一个缺点就是自动二值化的阙值会对轮廓提取产生影响,虽然可以自己定义阙值,但是不能每一章照片进行一次调节。

    import cv2 as cv
    def contours_demo(image):
          blurred = cv.GaussianBlur(image, (3, 3), 0)
          gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY)  # 灰路图像
         # ret , binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY| cv.THRESH_OTSU) # 图像二值化
          ret, binary = cv.threshold(gray, 68, 255, cv.THRESH_BINARY )  # 图像二值化
          cv.imshow("binary image",binary)
    
    
          contours, heriachy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
          for i, contour in enumerate(contours):
                cv.drawContours(image,contours,i,(0,0,255),6)   #6的改为-1可以填充
                print(i)
          cv.imshow("detect contours", image)
    
    
    src=cv.imread("D:\\1111.png")
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
    #cv.imshow("input image",src)
    contours_demo(src)
    cv.waitKey(0)
    
    cv.destroyAllWindows()
    

    2.边缘检测和轮廓调节

    代码如下(示例):

    import cv2 as cv
    
    
    def edge_demo(image):
        blurred = cv.GaussianBlur(image, (3, 3), 0)  # 高斯模糊
        gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)  # 灰路图像
        xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)  # xGrodient
        ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)  # yGrodient
        edge_output = cv.Canny(xgrad, ygrad, 100, 150)  # edge
        return edge_output
        def contours_demo(image):
         #  blurred = cv.GaussianBlur(image, (3, 3), 0)
         #  gray = cv.cvtColor(blurred, cv.COLOR_RGB2GRAY)  # 灰路图像
         # # ret , binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY| cv.THRESH_OTSU) # 图像二值化
         #  ret, binary = cv.threshold(gray, 68, 255, cv.THRESH_BINARY )  # 图像二值化
         #  cv.imshow("binary image",binary)
    
          binary = edge_demo(image)
    
          contours, heriachy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
          for i, contour in enumerate(contours):
                cv.drawContours(image,contours,i,(0,0,255),6)   #6的改为-1可以填充
                print(i)
          cv.imshow("detect contours", image)
    
    
    src=cv.imread("D:\\1111.png")
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
    #cv.imshow("input image",src)
    contours_demo(src)
    cv.waitKey(0)
    
    cv.destroyAllWindows()
    

    这样就可以避免掉方法一产生的问题,并且还可以很好的实现轮廓的提取


    总结

    鸣谢
    https://blog.csdn.net/weixin_42261213/article/details/93990410
    https://blog.csdn.net/miao0967020148/article/details/88623631

    展开全文
  • 开发环境为QT5.8+opencv3.2,主要实现了边缘检测,轮廓提取轮廓跟踪,边缘检测使用了Canny算子、Sobel算子、Laplacian算子,轮廓跟踪使用八邻域法。
  • import cv2 import numpy as np img = cv2.imread('1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY) image,contours, hierarchy = cv2....
    # 这里用的python2 在ubuntu 18.04 ros-melodic 上运行
    import cv2
    import numpy as np
    img = cv2.imread('1.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 120 指的是超过这个灰度的值都转为255
    ret, thresh = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
    # RETR_TREE 指全部边框
    image,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    contours = contours[1:]
    
    cv2.drawContours(img,contours,-1,(255,0,255),1)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    

    傅里叶变换
    https://www.bilibili.com/video/BV1Nb411T7Fu/?spm_id_from=333.788.videocard.2
    https://www.bilibili.com/video/BV1y4411S7um/?spm_id_from=333.788.videocard.9

    【使用教程】用傅立叶级数画一个比宇宙更远的地方

    用1000个卫星轨道画一只miku!

    数学科普up 3BLUE1BLOWN

    展开全文
  • opencv轮廓提取示例

    2018-05-25 15:21:35
    图片地址需要自己改动,用的是opencv提取轮廓函数,可以通过参数设定选择提取轮廓的外边缘和内边缘
  • OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓众所周知,图像查找轮廓可以用findContours函数解决,但是不知道大家发现一个问题没有,有时候输入图像,得到的结果会出现图像中一条边缘有查找到两个轮廓。...

    OpenCV中findContours轮廓提取一个边缘只对应的一个轮廓


    众所周知,图像查找轮廓可以用findContours函数解决,但是不知道大家发现一个问题没有,有时候输入图像,得到的结果会出现图像中一条边缘有查找到两个轮廓。当然只提取最外轮廓是不会出现重复情况,但设置提取所有轮廓会出现两个轮廓,对于利用得到的轮廓进一步处理带来不必要的麻烦。现在网上很多讲解findContours()函数都是讲解参数的,当真的用到这个函数会发现跟自己的结果并不如意。下面我就以我有限的感悟谈一下如何利用findContours()得到一条边缘得到对应的一个轮廓,当然不会去修改这个函数的代码。

    findContours()函数参数讲解

    • 输入image;
    • 输出contours,是二维向量的Point。如:vector< vector>contours;
    • hierarchy;每个轮廓的信息,后面要用到这些重要信息。
    • mode;轮廓检索模式,网上很多参数说明。
    • method;轮廓的近似办法。
    • offset;我没用过,直接默认参数。

    提取一个边缘只对应的一个轮廓

    这里说一下mode这个参数。
    RETR_EXTERNAL:表示只检测最外层轮廓,意思是图像中独立的个体只检测最外层轮廓,包含在里面的轮廓不会提取出来。
    RETR_LIST:提取所有轮廓,并放置在list中,不建立等级关系。意思就是提取出来的轮廓之间是没有联系的。
    RETR_CCOMP:提取所有轮廓,并且将其组织为双边结构。意思就是第一层为它的外围轮廓,第二层为内围轮廓,利用这个参数可以筛选出来一个独立边缘只对应一个轮廓。
    RETR_TREE:提取所有轮廓,并且重新建立网状轮廓结构。它体现出来的轮廓联系很紧密,比如说一个轮廓在另外一个轮廓的里面,轮廓里面又包含轮廓。
    对了,在参数method中有个标识符–CV_CHAIN_CODE,是生成Freeman码的,但是OpenCV提供的C++接口好像不好提取,还没有深究,C接口的代码我有,网上荡的,在百度知道搜的,那不缺大神哦。

    前面讲了那么多,进入正题吧。其实所有的轮廓关系在参数hierarchy中体现,大家可以调试看看那里面的值。hierarchy[i][0]–hierarchy[i][3]依次表示轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓,如果没有对应项,设置为-1。
    我们要得到一个边缘只对应的一个轮廓,需要在mode参数设置为RETR_CCOMP,表示双层结构,利用hierarchy中的信息筛选出轮廓。
    如下图,其实只有四个轮廓,但查找出来了七个轮廓。
    这里写图片描述

    hierarchy信息中对应的 值

    元素
    hierarchy[ 0]2,-1,1,-1
    hierarchy[ 1]-1,-1,-1,0
    hierarchy[ 2]4,0,3,-1
    hierarchy[ 3]-1,-1,-1,2
    hierarchy[ 4]6,2,5,-1
    hierarchy[ 5]-1,-1,-1,4
    hierarchy[ 6]-1,4,-1,-1

    由上表可以发现,每个hierarchy[i][0]对应的值指示下一个轮廓,注意,这里下一个轮廓指的是另外的轮廓,不是同一个边缘的另外一个轮廓。所以我们利用这个信息可以筛选出一个边缘的一条轮廓,分别是0->2->4->6四条轮廓。
    贴一下代码:

    vector<int>Index;
    for(int i=0;i<contours.size();)
    {
        int next=hierarchy[i][0];
        Index.push_back(i);
        i=next;
        if(i==-1)
            break;
    }

    输出的结果Index为(0,2,4,6)。

    总结

    需要用得到的轮廓做下一步处理可以使用这个方法免去多余的运算。其实也不算是方法,也就是自己一点点感悟吧,毕竟我自己也是学习者,还有很多不懂得地方。希望我这点感悟对您有所帮助,写的不对的地方还望见谅,谢谢!

    展开全文
  • opencv不论是轮廓提取,还是边缘检测,都会得到很多,一般来讲都会有几千个,不论是查找直线,还是查找圆,对几千个进行处理,都需要耗费很多时间。而很多时候,我们不需要这么多点,我们想要的结果是:随机的...
  • 这是一个基于opencv的图像轮廓提取程序,可以识别轮廓边沿,是初级学者的参考代码
  • OpenCV249实现车牌定位,采用是sobel边缘检测、轮廓检测、腐蚀等实现。
  • OPENCV轮廓提取findContours和drawContours

    万次阅读 多人点赞 2015-11-12 10:16:29
    关于opencv中的轮廓提取函数findcontours()和轮廓绘制函数drawContours()中参数的说明和实验结果。
  • 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓。 一个轮廓就是一系列的(像素),这些构成了一个有序的集合。 使用 cv2.findContours 函数可以用来检测图像的边缘。 函数原型...
  • 图像的轮廓提取有多种方法,现在我就提供几种方法。
  • OpenCV轮廓提取

    千次阅读 2014-07-23 21:33:51
    OpenCV中,一个轮廓一般对应一系列的,也就是图像中的一条曲线,表示方法可能根据不同的情况有所不同,在OpenCV中,一般用序列来存储轮廓信息,序列中的每一个元素是曲线中一个的位置。虽然Canny之类的边缘...
  • 【QT5&OpenCV边缘检测、轮廓提取轮廓跟踪

    千次阅读 热门讨论 2018-10-29 14:04:24
    开发环境为:win10+QT5.8+opencv3.2 数字图像的边缘检测是图像分割...本文主要实现图像边缘检测、轮廓提取轮廓跟踪。 一、读取图像 读取图像见QT+opencv学习笔记(1)——图像运算,这里不再赘述。 ...
  • python-opencv边缘清洗法提取图片轮廓和前景内容

    千次阅读 热门讨论 2019-07-31 12:01:46
    为了解决这个问题,我接触了opencv这个库,突然觉得这玩意太牛逼了,不光可以处理图片,还内置很多人工智能算法,于是暂时放弃了游戏开发,转战计算机视觉。 学了几天基础知识,刚开始觉得有好多种方法都可以提取...
  • OpenCV-目标轮廓提取

    2020-12-21 15:17:21
    我们可以通过findContours函数将二值图像的边缘像素分成多个轮廓,从而逐个提取目标外部轮廓,内部轮廓有待研究。 Python: import cv2 as cv import numpy as np if __name__=="__main__": img=cv.imread("D:/...
  • OpenCVSharp入门教程 特征提取②——FindContours寻找轮廓轮廓提取。 一、前文; 二、算法流程; 三、界面布局; 四、功能实现; 4.1 打开图片; 4.2 Canny边缘检测—源码; 4.3 Canny边缘检测—参数讲解; 五、...
  • opencv轮廓在轮廓内判断

    万次阅读 2015-04-07 16:41:30
    openCV中一般用序列来存储轮廓信息.序列中的每一个元素是曲线中一个的位置.关于序列表示的轮廓细节将在后面讨论,现在只要简单把轮廓想象为使用CvSeq表示的一系列的就可以了. 函数cvFindContours()从二值...
  • Android Opencv 轮廓提取

    千次阅读 2019-06-25 16:48:30
    1.把图片转成灰度图 ...3.用canny检查边缘 4.查找轮廓 这里查找的是图片中最大的矩形 Mat src=new Mat(); Mat grayMat=new Mat(); Mat edge=new Mat(); Utils.bitmapToMat(bitmap_src, src); I...
  • opencv轮廓提取

    2015-10-08 21:04:11
    基于hsv肤色提取,运用中值滤波和边缘检测,提取手势轮廓
  • 看下面这张提取轮廓的叶片图,外轮廓问题不大,关键里面的子轮廓,有点乱,本来是想识别提取虫洞,结果… 有没有人提提思路,给建议,剔除这些杂乱的"虚假虫洞" ...
  • Opencv实现特征点提取和匹配

    热门讨论 2014-04-02 10:57:42
    基于OpenCV的实现特征点提取和匹配的程序。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,784
精华内容 2,313
关键字:

opencv轮廓边缘点提取