查看: 1253|回复: 0

​[BBB试用之旅7] 使用openCV捕获摄像头图片,并作边缘检测

[复制链接]
  • TA的每日心情
    难过
    2017-4-18 09:57
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-4-6 08:44:17 | 显示全部楼层 |阅读模式
    分享到:
    系列阅读:https://jingyan.eeboard.com/category/53
    openCV首先将我参考的案例放在这里https://derekmolloy.ie/beaglebone/beaglebone-video-... 东西确实做得好,多学习学习总没有坏处。
    先确认下本篇需要的库环境 一个是openCV版本

    另外查看下摄像头支持的格式,了解V4L2驱动的情况:

    1. 首先下载derekmolloy分享在Git 上的代码boneCV 软件包   
    git clone git://github.com/derekmolloy/bone  ,下图是boneCV 软件包的详细内容

    再把boneCV 源代码贴出来 分析一下,包含了摄像头截图,并作边沿检测的功能,Canny 算子的目标是找到一个最优的边缘检测算法。
    #include<iostream>
    #include<opencv2/opencv.hpp>
    usingnamespacestd;
    usingnamespacecv;
    intmain()
    {
    VideoCapture capture(0);                                     //打开视频文件:建立一个VideoCapture结构,或者可以手动载入图片
    //Mat srcImage = imread("/Users/YWY/Pictures/house.jpg");
    capture.set(CV_CAP_PROP_FRAME_WIDTH,1024);           //设置图片分辨率
    capture.set(CV_CAP_PROP_FRAME_HEIGHT,768);
    if(!capture.isOpened()){                                       //检测是否正常打开:成功打开时,isOpened返回ture

    cout<<"Failed to connect to the camera."<<endl;
    }
    Mat frame,edges;   
    capture>>frame;
    if(frame.empty()){
    cout<<"Failed to capture an image"<<endl;
    return-1;
    }
    cvtColor(frame,edges,CV_BGR2GRAY);                、/转换为灰度图,参数CV_BGR2GRAY则是OpenCV2中的用法中的用法
    //          blur( grayImage, edge, Size(3,3) );               //或可调用Blur 模糊化
    Canny(edges,edges,0,30,3);                                  //运行Canny算子,3为threshold1,9为threshold2                     
    imwrite("edges.png",edges);
    imwrite("capture.png",frame);
    return0;
    }

    顺便了解下Canny函数,如下摘自其它博文
    void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )

    • 第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
    • 第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。
    • 第三个参数,double类型的threshold1,第一个滞后性阈值。
    • 第四个参数,double类型的threshold2,第二个滞后性阈值。
    • 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
    • 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。
    边缘检测的一般步骤:边缘检测的一般步骤:

    • 滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和。
    • 增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定。
    • 检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
    2. 执行编译

    3. 运行,虽然有很多invalid argument 的信息,按derek视频的解释是这个小警告不影响结果的,只要没有报错或者timeout就都是可以产生边缘检测结果的。

    4,结果 ,将图片通过sftp 传送到笔记本电脑的ubuntu上查看 ,对边缘检测并无太多研究,当作是一次试验吧,第一张边缘检测的直线部分还是清晰可见的。如果各位看官有任何改进建议可随时跟贴留言。多谢了。



    来一张小图示意下。

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 15:35 , Processed in 0.116567 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.