霍夫线性变换(视频)

该博客演示了如何使用OpenCV库通过霍夫线性变换(HoughLines和HoughLinesP)在图像中检测线条。代码分别展示了静态图像和视频帧中的应用,通过Canny边缘检测预处理,然后进行霍夫变换,最终在原始图像上绘制检测到的线条。
摘要由CSDN通过智能技术生成

#include "opencv2/imgcodecs.hpp"

#include "opencv2/highgui.hpp"

#include "opencv2/imgproc.hpp"

 

#include <iostream>

 

using namespace cv;

using namespace std;

 

static void help()

{

    cout << "\nThis program demonstrates line finding with the Hough transform.\n"

            "Usage:\n"

            "./houghlines <image_name>, Default is ../data/pic1.png\n" << endl;

}

 

int main(int argc, char** argv)

{

    cv::CommandLineParser parser(argc, argv,

        "{help h||}{@image|../data/pic1.png|}"

    );

    if (parser.has("help"))

    {

        help();

        return 0;

    }

    string filename = parser.get<string>("@image");

    if (filename.empty())

    {

        help();

        cout << "no image_name provided" << endl;

        return -1;

    }

    Mat src = imread(filename, 0);

    if(src.empty())

    {

        help();

        cout << "can not open " << filename << endl;

        return -1;

    }

 

    Mat dst, cdst;

    Canny(src, dst, 50, 200, 3);

    cvtColor(dst, cdst, COLOR_GRAY2BGR);

 

#if 0

    vector<Vec2f> lines;

    HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );

 

    for( size_t i = 0; i < lines.size(); i++ )

    {

        float rho = lines[i][0], 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( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);

    }

#else

    vector<Vec4i> lines;

    HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );

    for( size_t i = 0; i < lines.size(); i++ )

    {

        Vec4i l = lines[i];

        line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, LINE_AA);

    }

#endif

    imshow("source", src);

    imshow("detected lines", cdst);

 

    waitKey();

 

    return 0;

}

 

 

#include "stdafx.h"

#include <opencv2/opencv.hpp>

#include <iostream>

using namespace cv;

using namespace std;

void main()

{

VideoCapture capture("../1.avi");

while (1)

{

Mat frame;

capture >> frame;

Mat midImage, dstImage;

Canny(frame, midImage, 50, 200, 3);

cvtColor(midImage, dstImage, CV_GRAY2BGR);

vector<Vec4i> lines;

HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);

for (size_t i = 0; i < lines.size(); i++)

{

Vec4i l = lines[i];

line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 3, LINE_AA);

}

imshow("1", frame);

imshow("2", midImage);

imshow("3", dstImage);

waitKey(100);

if (frame.empty())

{

break;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值