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

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

OpenCV3.0 Examples學習筆記(5)-distrans.cpp

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

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

簡介
本文記錄了對OpenCV示例distrans.cpp的分析。
資料地址:http://docs.opencv.org/3.0.0/d4/d11/distrans_8cpp-example.html

首先這個示例,主要講述了distanceTransform函數的使用。distanceTransform函數用于計算2值圖象中所有像素力其最近的值為0像素的近似距離。這個函數非常有用,
可以用于細化輪廓或尋覓物體質心。

全部示例可以總結為
(1)2值化
(2)調用distanceTransform函數
(3)根據distanceTransform函數計算結果,繪制距離變換圖象(圖象的值表示距離)。


Example截圖
原圖
處理結果
參數
2值化閾值:edgeThresh=100
distanceTransform參數:
distanceType = DIST_L1
maskSize = DIST_MASK_5


Example分析
示例主要觸及distanceTransform函數的使用。
如果對distanceTransform算法本身感興趣可以傳送至Distance Transform  距離變換。
如果想進1步了解distanceTransform函數的使用,可以傳送至Opencv距離變換distanceTransform利用——細化字符輪廓&&查找物體質心。
distanceTransform
計算2值圖象,任意點到最近背景點的距離,1般為非零點到最近零點的距離。

distanceTransform函數計算2值圖象中所有像素力其最近的值為0像素的近似距離。明顯如果像素本身為0,則其距離明顯也為0。

函數原型:
void distanceTransform( InputArray src, OutputArray dst,
                                     int distanceType, int maskSize, int dstType=CV_32F);
參數說明:
src:源圖象,需要采取2值化后的8位灰度圖象
dst:目標圖象,可以是8位或32位浮點,尺寸和src相同
distanceType:計算距離的方式,具體以下
    DIST_USER    = ⑴,  //!< User defined distance
    DIST_L1      = 1,   //!< distance = |x1-x2| + |y1-y2|
    DIST_L2      = 2,   //!< the simple euclidean distance
    DIST_C       = 3,   //!< distance = max(|x1-x2|,|y1-y2|)
    DIST_L12     = 4,   //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
    DIST_FAIR    = 5,   //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998
    DIST_WELSCH  = 6,   //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846
    DIST_HUBER   = 7    //!< distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345
maskSize:掩膜的尺寸,具體以下:
    DIST_MASK_3       = 3, //!< mask=3
    DIST_MASK_5       = 5, //!< mask=5
    DIST_MASK_PRECISE = 0  //!<
    PS:當distanceType = DIST_L1或DIST_C時,maskSize強迫為3(設為5也沒用)
dstType:目標圖象的類型,默許為CV_32F;

Example代碼

#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

#include <stdio.h>

using namespace std;
using namespace cv;

int maskSize0 = DIST_MASK_5;
int voronoiType = ⑴;
int edgeThresh = 100;
int distType0 = DIST_L1;

// The output and temporary images
Mat gray;

// threshold trackbar callback
static void onTrackbar( int, void* )
{
    static const Scalar colors[] =
    {
        Scalar(0,0,0),
        Scalar(255,0,0),
        Scalar(255,128,0),
        Scalar(255,255,0),
        Scalar(0,255,0),
        Scalar(0,128,255),
        Scalar(0,255,255),
        Scalar(0,0,255),
        Scalar(255,0,255)
    };

    int maskSize = voronoiType >= 0 ? DIST_MASK_5 : maskSize0;
    int distType = voronoiType >= 0 ? DIST_L2 : distType0;

    Mat edge = gray >= edgeThresh, dist, labels, dist8u;

    if( voronoiType < 0 )
        distanceTransform( edge, dist, distType, maskSize );
    else
        distanceTransform( edge, dist, labels, distType, maskSize, voronoiType );

    if( voronoiType < 0 )
    {
        // begin "painting" the distance transform result
        dist *= 5000;
        pow(dist, 0.5, dist);

        Mat dist32s, dist8u1, dist8u2;

        dist.convertTo(dist32s, CV_32S, 1, 0.5);
        dist32s &= Scalar::all(255);

        dist32s.convertTo(dist8u1, CV_8U, 1, 0);
        dist32s *= ⑴;

        dist32s += Scalar::all(255);
        dist32s.convertTo(dist8u2, CV_8U);

        Mat planes[] = {dist8u1, dist8u2, dist8u2};
        merge(planes, 3, dist8u);
    }
    else
    {
        dist8u.create(labels.size(), CV_8UC3);
        for( int i = 0; i < labels.rows; i++ )
        {
            const int* ll = (const int*)labels.ptr(i);
            const float* dd = (const float*)dist.ptr(i);
            uchar* d = (uchar*)dist8u.ptr(i);
            for( int j = 0; j < labels.cols; j++ )
            {
                int idx = ll[j] == 0 || dd[j] == 0 ? 0 : (ll[j]⑴)%8 + 1;
                float scale = 1.f/(1 + dd[j]*dd[j]*0.0004f);
                int b = cvRound(colors[idx][0]*scale);
                int g = cvRound(colors[idx][1]*scale);
                int r = cvRound(colors[idx][2]*scale);
                d[j*3] = (uchar)b;
                d[j*3+1] = (uchar)g;
                d[j*3+2] = (uchar)r;
            }
        }
    }

    imshow("Distance Map", dist8u );
}

static void help()
{
    printf("\nProgram to demonstrate the use of the distance transform function between edge images.\n"
            "Usage:\n"
            "./distrans [image_name -- default image is ../data/stuff.jpg]\n"
            "\nHot keys: \n"
            "\tESC - quit the program\n"
            "\tC - use C/Inf metric\n"
            "\tL1 - use L1 metric\n"
            "\tL2 - use L2 metric\n"
            "\t3 - use 3x3 mask\n"
            "\t5 - use 5x5 mask\n"
            "\t0 - use precise distance transform\n"
            "\tv - switch to Voronoi diagram mode\n"
            "\tp - switch to pixel-based Voronoi diagram mode\n"
            "\tSPACE - loop through all the modes\n\n");
}

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

int main( int argc, const char** argv )
{
    help();
    CommandLineParser parser(argc, argv, keys);
    string filename = parser.get<string>(0);
    gray = imread(filename.c_str(), 0);
    if(gray.empty())
    {
        printf("Cannot read image file: %s\n", filename.c_str());
        help();
        return ⑴;
    }

    namedWindow("Distance Map", 1);
    createTrackbar("Brightness Threshold", "Distance Map", &edgeThresh, 255, onTrackbar, 0);

    for(;;)
    {
        // Call to update the view
        onTrackbar(0, 0);

        int c = waitKey(0) & 255;

        if( c == 27 )
            break;

        if( c == 'c' || c == 'C' || c == '1' || c == '2' ||
            c == '3' || c == '5' || c == '0' )
            voronoiType = ⑴;

        if( c == 'c' || c == 'C' )
            distType0 = DIST_C;
        else if( c == '1' )
            distType0 = DIST_L1;
        else if( c == '2' )
            distType0 = DIST_L2;
        else if( c == '3' )
            maskSize0 = DIST_MASK_3;
        else if( c == '5' )
            maskSize0 = DIST_MASK_5;
        else if( c == '0' )
            maskSize0 = DIST_MASK_PRECISE;
        else if( c == 'v' )
            voronoiType = 0;
        else if( c == 'p' )
            voronoiType = 1;
        else if( c == ' ' )
        {
            if( voronoiType == 0 )
                voronoiType = 1;
            else if( voronoiType == 1 )
            {
                voronoiType = ⑴;
                maskSize0 = DIST_MASK_3;
                distType0 = DIST_C;
            }
            else if( distType0 == DIST_C )
                distType0 = DIST_L1;
            else if( distType0 == DIST_L1 )
                distType0 = DIST_L2;
            else if( maskSize0 == DIST_MASK_3 )
                maskSize0 = DIST_MASK_5;
            else if( maskSize0 == DIST_MASK_5 )
                maskSize0 = DIST_MASK_PRECISE;
            else if( maskSize0 == DIST_MASK_PRECISE )
                voronoiType = 0;
        }
    }

    return 0;
}

參考資料:
1.《基于distanceTransform-距離變換的區域中心提取
2.《Distance Transform 距離變換
3.《Distance Transform  距離變換
4.《Opencv距離變換distanceTransform利用——細化字符輪廓&&查找物體質心
5.《基于距離變換的新型骨架提取方法


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 老妇毛片久久久久久久久 | freexx性欧美hd | 熟妇毛片 | 日本a v 黄 | 国产jizz18高清视频 | 午夜黄视频 | 久久免费观看国产精品 | 日本精品a在线观看 | 亚洲成网站www久久九 | 一区二区不卡久久精品 | 国产一精品一aⅴ一免费 | 小说区图片区 | 97精品一区二区三区在线不卡 | www.99精品视频在线播放 | 国产在线视频资源 | 一区二区三区四区 | 欧洲乱码专区一区二区三区四区 | 日本xxx护士21 | 国产最新一区二区三区天堂 | 欧美系列第一页 | porn日本xxx护士 | 亚洲视频1 | 国产v片在线观看 | 波多野吉衣 免费一区 | 日韩中文字幕精品久久 | 亚州视频一区二区 | 中文字幕在线观看一区 | 免费一级特黄欧美大片久久网 | 岛国在线最新 | 国产偷v国产偷v亚洲偷v | 久久亚洲欧美 | 国产一精品一aⅴ一免费 | 免费欧洲毛片a级视频 | 亚洲色图欧美一区 | 一区二区三区高清在线 | 欧美性一区二区三区 | 毛片新网址| 欧美操人视频 | 曰本www | 国产v在线| 国产精品第一区第27页 |