多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > OpenCV3.0 Examples學習筆記(6)-edge.cpp

OpenCV3.0 Examples學習筆記(6)-edge.cpp

來源:程序員人生   發布時間:2017-02-05 13:52:18 閱讀次數:4607次
這個系列的目的是通過對OpenCV示例,進1步了解OpenCV函數的使用,不觸及具體原理。

目錄
簡介
Example運行截圖
Example分析
Example代碼

簡介
本文記錄了對OpenCV示例edge.cpp的分析。
資料地址:http://docs.opencv.org/3.0.0/d3/d63/edge_8cpp-example.html

首先這個示例,主要講述了使用Canny函數獲得圖象邊沿。

Canny算法原理
    Canny 邊沿檢測算法 是 John F. Canny 于 1986年開發出來的1個多級邊沿檢測算法,也被很多人認為是邊沿檢測的 最優算法, 最優邊沿檢測的3個主要評價標準是:
  • 低毛病率: 標識出盡量多的實際邊沿,同時盡量的減少噪聲產生的誤報。
  • 高定位性: 標識出的邊沿要與圖象中的實際邊沿盡量接近。
  • 最小響應: 圖象中的邊沿只能標識1次。

Canny步驟
  1. 消除噪聲。 使用高斯平滑濾波器卷積降噪。 下面顯示了1個size = 5 的高斯內核示例:


  2. 計算梯度幅值和方向。 此處,依照Sobel濾波器的步驟:

    1. 應用1對卷積陣列 (分別作用于 x 和 y方向):


    2. 使用以下公式計算梯度幅值和方向:


      梯度方向近似到4個可能角度之1(1般 0, 45, 90, 135)

  3. 非極大值 抑制。 這1步排除非邊沿像素, 僅僅保存了1些細線條(候選邊沿)。

  4. 滯后閾值: 最后1步,Canny 使用了滯后閾值,滯后閾值需要兩個閾值(高閾值和低閾值):

    1. 如果某1像素位置的幅值超過  閾值, 該像素被保存為邊沿像素。
    2. 如果某1像素位置的幅值小于  閾值, 該像素被排除。
    3. 如果某1像素位置的幅值在兩個閾值之間,該像素僅僅在連接到1個高于  閾值的像素時被保存。

    Canny 推薦的 : 閾值比在 2:1 到3:1之間。

    以上內容摘至參考資料5.《圖象邊沿檢測--OpenCV之cvCanny函數


Canny函數在OpenCV中的原型
Canny

函數原型:
void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

參數說明:
image: 輸入圖象,需要8位圖象。
edges: 輸出邊沿圖象。
threshold1: 第1個滯后閾值。
threshold2: 第2個滯后閾值。
apertureSize: Sobel算子的孔徑大學。
L2gradient : 計算圖象梯度值的標識,1般使用默許值false。

PS: 參數threshold1和threshold2中使用小的1個進行邊沿連接,大的用來控制強邊沿的初始段,1般比例為2:1至3:1之間。

Example截圖
原圖
處理結果
參數
threshold1 = 1
threshold2 = 3
apertureSize = 3
L2gradient =false

Example分析
示例主要步驟以下:
1.申明需要使用的變量:
int edgeThresh = 1;
Mat image, gray, edge, cedge;

PS:Canny函數由高低兩個閾值,用戶在本示例只設置低閾值edgeThresh,令高閾值為低閾值的3倍。

2.從命令行參數中加載圖象:
CommandLineParser parser(argc, argv, keys);
    string filename = parser.get<string>(0);

    image = imread(filename, 1);
    if(image.empty())
    {
        printf("Cannot read image file: %s\n", filename.c_str());
        help();
        return ⑴;
    }

3.創建與原圖相同尺寸樣式的圖象,用于繪制邊沿檢測結果:
cedge.create(image.size(), image.type());

4.灰度化
cvtColor(image, gray, COLOR_BGR2GRAY);

5創建預覽窗口
namedWindow("Edge map", 1);

6.創建滑動條,用于用戶交互,設置閾值
createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar);

PS:認為低閾值上限為100;
PS1:Trackbar變動改變edgeThresh,調用回調函數onTrackbar。

7.分析onTrackbar函數
    7.1均值濾波,平滑圖象
    blur(gray, edge, Size(3,3));

    7.2使用Canny尋覓邊沿
    Canny(edge, edge, edgeThresh, edgeThresh*3, 3);

    7.3將cedge 填充為黑色(0
    cedge = Scalar::all(0);

    7.4將Canny函數結果(邊沿檢測結果)復制到cedge(背景為黑色)
    image.copyTo(cedge, edge);

    7.5顯示圖象
    imshow("Edge map", cedge);


Example代碼
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

#include <stdio.h>

using namespace cv;
using namespace std;

int edgeThresh = 1;
Mat image, gray, edge, cedge;

// define a trackbar callback
static void onTrackbar(int, void*)
{
    blur(gray, edge, Size(3,3));

    // Run the edge detector on grayscale
    Canny(edge, edge, edgeThresh, edgeThresh*3, 3);
    cedge = Scalar::all(0);

    image.copyTo(cedge, edge);
    imshow("Edge map", cedge);
}

static void help()
{
    printf("\nThis sample demonstrates Canny edge detection\n"
           "Call:\n"
           "    /.edge [image_name -- Default is ../data/fruits.jpg]\n\n");
}

const char* keys =
{
    "{@image |../data/fruits.jpg|input image name}"
};

int main( int argc, const char** argv )
{
    help();

    CommandLineParser parser(argc, argv, keys);
    string filename = parser.get<string>(0);

    image = imread(filename, 1);
    if(image.empty())
    {
        printf("Cannot read image file: %s\n", filename.c_str());
        help();
        return ⑴;
    }
    cedge.create(image.size(), image.type());
    cvtColor(image, gray, COLOR_BGR2GRAY);

    // Create a window
    namedWindow("Edge map", 1);

    // create a toolbar
    createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar);

    // Show the image
    onTrackbar(0, 0);

    // Wait for a key stroke; the same function arranges events processing
    waitKey(0);

    return 0;
}


參考資料:
1.《【opencv 1日1練】 api 之 blur
2.《【OpenCV入門指南】第3篇Canny邊沿檢測
3.《【OpenCV】Canny 邊沿檢測
4.《Canny 邊沿檢測
5.《
圖象邊沿檢測--OpenCV之cvCanny函數
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 69久久夜色精品国产69 | 国产福利自产拍在线观看 | julia一区福利视频在线观看 | 久久久久久久久久久大尺度免费视频 | 国产永久视频 | 无人区乱码1区2区3区mv | 2022男人天堂 | 欧美三级视频 | 亚洲视频 欧美视频 | 久久毛片免费看 | 日本欧美成人 | 国精品一区二区三区 | 日本欧美韩国一区二区三区 | 伊人色院成人蜜桃视频 | 一级做a爱片就在线看 | 最新国产精品精品视频 | 国产五月| 波多野一区二区 | 亚洲欧美综合精品成 | 国产精品久久久久久久久久久威 | 国产亚洲福利精品一区二区 | 日本黄色大片 | jizzjizzjizz亚洲女 | 视频一区二区三区在线观看 | 亚洲欧美日韩综合一区久久 | 图片区小说区校园小说 | 亚洲高清在线观看视频 | 簧片免费在线观看 | 日本不卡一区二区三区 最新 | v天堂中文在线 | 伊人久久99亚洲精品久久频 | 国产精品永久免费视频观看 | 国产图色 | 欧美性一区 | 在线不欧美 | 中文字幕乱码一二三四区 | 最近高清中文国语视频 | jizz.日本| 手机看片国产高清 | 精品久久亚洲一级α | 最近中文字幕视频在线资源 |