opencv_ex20-圖像縮小pyrDown、灰階圖像可調式邊緣檢測Canny、圖像轉換+複製cvtColor、直線偵測HoughLinesP、畫線函數line

opencv_ex20-圖像縮小pyrDown、灰階圖像可調式邊緣檢測Canny、圖像轉換+複製cvtColor、直線偵測HoughLinesP、畫線函數line

opencv_ex20-圖像縮小pyrDown、灰階圖像可調式邊緣檢測Canny、圖像轉換+複製cvtColor、直線偵測HoughLinesP、畫線函數line


GITHUB: https://github.com/jash-git/CPP_opencv249_ex


    OpenCV 直線偵測
        void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)

        image:輸入圖,8位元單通道二值化圖。
        lines:將所有線的資料存在vector< Vec4i >,Vec4i為每個線段的資料,分別有x1、y1、x2、y2這四個值,(x1,y1)和(x2,y2)分別表示線段的頭尾頂點。
        rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
        theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI/180
        threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
        minLineLength :線段最短距離,超過此值的線才會存在lines這個容器內。 0
        maxLineGap:最大間隔。 10

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>

#include <iostream>
#include <cstdio>

#include <sys/timeb.h>
#if defined(WIN32)
    #define  TIMEB    _timeb
    #define  ftime    _ftime
    typedef __int64 TIME_T;
#else
    #define TIMEB timeb
    typedef long long TIME_T;
#endif

using namespace cv;
using namespace std;
Mat src;//input image
void Pause()
{
    printf("Press Enter key to continue...");
    fgetc(stdin);
}

int main()
{
    Mat input;
	input = imread("hough01.png");
	if (!input.data)
    {
		printf("could not load image...\n");
	}
    else
    {
        //縮小
        pyrDown(input, src, Size(input.cols/2, input.rows/2));



        char INPUT_TITLE[] = "input image";
        char OUTPUT_TITLE[] = "hough-line-detection";
        namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
        namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
        imshow(INPUT_TITLE, src);

        Mat src_gray,dst;
        Canny(src, src_gray, 150, 200);
        cvtColor(src_gray, dst, CV_GRAY2BGR);
        imshow("edge image", src_gray);

        /*
        OpenCV 直線偵測
        void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)
        image:輸入圖,8位元單通道二值化圖。
        lines:將所有線的資料存在vector< Vec2f >,Vec2f為每個線的資料,分別有ρ、θ這兩個參數,ρ表示和左上角(0,0)的距離,θ是線的旋轉角度,單位弧度,垂直線的θ為0,水平線的θ為π/2。
        rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
        theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI / 180
        threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
        srn:可有可無的距離除數。
        stn:可有可無的角度除數。
        */

        /*
        vector<Vec2f> lines;
        HoughLines(src_gray, lines, 1, CV_PI / 180, 140, 0, 0);
        Scalar color = Scalar(0, 0, 255);
        for (size_t i = 0; i < lines.size(); i++)
        {
            float rho = lines[i][0]; // 极坐标中的r长度
            float theta = lines[i][1]; // 极坐标中的角度
            Point pt1, pt2;
            double a = cos(theta), b = sin(theta);
            double x0 = a*rho, y0 = b*rho;
            // 转换为平面坐标的四个点
            pt1.x = cvRound(x0 + 1000 * (-b));
            pt1.y = cvRound(y0 + 1000 * (a));
            pt2.x = cvRound(x0 - 1000 * (-b));
            pt2.y = cvRound(y0 - 1000 * (a));
            line(dst, pt1, pt2, color, 1, CV_AA);
        }
        //*/

        /*
        OpenCV 直線偵測
        void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)
        image:輸入圖,8位元單通道二值化圖。
        lines:將所有線的資料存在vector< Vec4i >,Vec4i為每個線段的資料,分別有x1、y1、x2、y2這四個值,(x1,y1)和(x2,y2)分別表示線段的頭尾頂點。
        rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
        theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI/180
        threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
        minLineLength :線段最短距離,超過此值的線才會存在lines這個容器內。 0
        maxLineGap:最大間隔。 10
        )
        */
        //*
        vector<Vec4i> lines;
        HoughLinesP(src_gray, lines, 1, CV_PI/180, 10,0,10);
        for( size_t i = 0; i < lines.size(); i++ )
        {
            Vec4i l = lines[i];//Vec4i 就是Vec<int, 4>,里面存放4个int
            line( dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 1, CV_AA);
            //要划的线所在的图像:dst, 起点:Point(l[0], l[1]), 终点:Point(l[2], l[3]), 1 線寬 , 颜色:Scalar(0,0,255)
        }
        //*/

        imshow(OUTPUT_TITLE, dst);

    }
    waitKey(0);
    Pause();
    return 0;
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *