zoukankan      html  css  js  c++  java
  • opencv 5 图像转换(2 霍夫变换)

    霍夫线变换


    标准霍夫变换和多尺度霍夫变换(HoughLines()函数)


    实例:

    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    using namespace std;
    
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //		描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
    	//【1】载入原始图和Mat变量定义   
    	Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    
    	//【2】进行边缘检测和转化为灰度图
    	Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测
    	//imshow("canny", midImage);
    	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
    
    	//【3】进行霍夫线变换
    	vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
    	HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);
    
    	//【4】依次在图中绘制出每条线段
    	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));
    		//此句代码的OpenCV2版为:
    		//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);
    		//此句代码的OpenCV3版为:
    		line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
    	}
    
    	//【5】显示原始图  
    	imshow("【原始图】", srcImage);
    
    	//【6】边缘检测后的图 
    	imshow("【边缘检测后的图】", midImage);
    
    	//【7】显示效果图  
    	imshow("【效果图】", dstImage);
    
    	waitKey(0);
    
    	return 0;
    }
    

    累计概率霍夫变换(HoughLinesP())


    实例

    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    using namespace std;
    
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //		描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-------------------------------------------------------------------------------------------------
    int main()
    {
    	//【1】载入原始图和Mat变量定义   
    	Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    
    	//【2】进行边缘检测和转化为灰度图
    	Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测
    	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
    
    	//【3】进行霍夫线变换
    	vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
    	HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);
    
    	//【4】依次在图中绘制出每条线段
    	for (size_t i = 0; i < lines.size(); i++)
    	{
    		Vec4i l = lines[i];
    		//此句代码的OpenCV2版为:
    		//line( dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 1, CV_AA);
    		//此句代码的OpenCV3版为:
    		line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);
    	}
    
    	//【5】显示原始图  
    	imshow("【原始图】", srcImage);
    
    	//【6】边缘检测后的图 
    	imshow("【边缘检测后的图】", midImage);
    
    	//【7】显示效果图  
    	imshow("累计概率霍夫变换【效果图】", dstImage);
    
    	waitKey(0);
    
    	return 0;
    }
    
    
    

    霍夫圆变换

    霍夫梯度法


    HoughCircles()函数




    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    using namespace std;
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //		描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
    	//【1】载入原始图、Mat变量定义   
    	Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    
    	//【2】显示原始图
    	imshow("【原始图】", srcImage);
    
    	//【3】转为灰度图并进行图像平滑
    	cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//转化边缘检测后的图为灰度图
    	GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
    
    	//【4】进行霍夫圆变换
    	vector<Vec3f> circles;
    	HoughCircles(midImage, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
    
    	//【5】依次在图中绘制出圆
    	for (size_t i = 0; i < circles.size(); i++)
    	{
    		//参数定义
    		Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    		int radius = cvRound(circles[i][2]);
    		//绘制圆心
    		circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    		//绘制圆轮廓
    		circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
    	}
    
    	//【6】显示效果图  
    	imshow("【效果图】", srcImage);
    
    	waitKey(0);
    
    	return 0;
    }
    
  • 相关阅读:
    给入坑前端的新人的建议
    浅析js闭包
    mongoose之操作mongoDB数据库
    input模拟输入下拉框
    浅析AngularJS自定义指令之嵌入(transclude)
    vue-cli之打包多入口配置
    Node.js之图片上传
    移动端之模态框滚动穿透问题
    浅谈vue之动态路由匹配
    vuex数据持久化存储
  • 原文地址:https://www.cnblogs.com/xingkongcanghai/p/11187114.html
Copyright © 2011-2022 走看看