当前位置: 首页 > news >正文

Opencv中直线的表示方法

                           【blog算法原理】Opencv中直线的表示方法
 一、问题的提出:​       
  在实际项目编写过程中,需要对直线(Line)进行特定的处理。在以前的项目设计实现中,直线(Line)多是用来绘图使用的,而不是用来进行分析的。
  经过较为仔细地研究Opencv提供的相关内容,感觉这个问题很有搞头,所以分离出来研究。先看refman
 
 
 
 
 
可以看到,opencv自己提供的3种直线寻找的函数,最后得到的表示line的数据结构和表示内容的表示都是不一样的。出现这个原因,可能是因为编写这几个函数的不是一个开发者;也可能是认为地选择了最适合特定函数使用的数据结构。那么这3个函数效果到底怎么样?如何灵活使用到自己的项目中?最后我将提出结合自己实际编写的函数。
 
二、函数测试
由于后2个函数都能够直接以图像(MAT)作为参数,所以用一副标准图像进行测试;而后针对Linefit能够以点集作为输入的情况单独测试(如果要使用同样的图像需要先细化再找边缘,比较麻烦),并且提出自己编写的方法。
测试图像为
编写代码
# include  "stdafx.h"
# include  <iostream >
# include  "opencv2/core/core.hpp"
# include  "opencv2/highgui/highgui.hpp"
# include  "opencv2/imgproc/imgproc.hpp"
//【blog算法原理】Opencv中直线的表示方法
// jsxyhelu 2016年1月20日
using  namespace std;
using  namespace cv;
void main()
{
    Mat    src;
    Mat board; //用于将识别出来直线绘制出来
    Mat board2;
    vector <Vec4i > lines;
    vector <Vec2f > linesf;
     ///主要流程///
    src  = imread( "PureLine.jpg", 0);
    board  = Mat : :zeros(src.size(),src.type());
    board2  = Mat : :zeros(src.size(),src.type());
     HoughLineP测试
    HoughLinesP(src, lines,  1, CV_PI / 180505010 );
     HoughLine测试
    HoughLines(src, linesf,  1, CV_PI / 18010000 );
     ///显示结果///
     for( size_t i  =  0; i  < lines.size(); i ++ ){
        Vec4i l  = lines[i];
        line( board, Point(l[ 0], l[ 1]), Point(l[ 2], l[ 3]), Scalar( 255),  1, CV_AA);
    }
     for( size_t i  =  0; i  < linesf.size(); i ++ ){
         float rho  = linesf[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( board2, pt1, pt2, Scalar( 255), 1, CV_AA);
    }
    imshow( "src",src);
    waitKey();
}
 
结果
(HoughLineP)
 
(HoughLine)
从结果上来看,HoughlineP识别的要更准确。这两个函数一个是识别出来图形上的点,一个是识别出来角度和图像上的点。两个函数的结果都是自己编写代码打印出来的。
 
三、结合实际
实际上我需要的是识别出直线,并且对图像进行旋转。这部分的代码是这样的
        Point pt1;
    Point pt2;
     float t  = ( float)(src.cols +src.rows);
    pt1.x  = cvRound(Line1[ 2- Line1[ 0] *t);
    pt1.y  =cvRound(Line1[ 3] -Line1[ 1] *t);
    pt2.x  = cvRound(Line1[ 2] +Line1[ 0] *t);
    pt2.y  = cvRound(Line1[ 3] +Line1[ 1] *t);
    line( src, pt1, pt2, Scalar( 255), 1, CV_AA);
     //对结果图像进行旋转
    Point center  = Point( src.cols / 2, src.rows / 2 ); //以图像中心为中心
     double angle  =atan(Line1[ 1] /Line1[ 0]);
    angle   = Rad2Deg(angle); //由弧度转换为角度
     /// 通过上面的旋转细节信息求得旋转矩阵
    Mat rot_mat  = getRotationMatrix2D( center, angle,  1 );
     /// 旋转已扭曲图像
    warpAffine( src, dst, rot_mat, src.size() );



 



目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

相关文章:

  • Grok debugger
  • ubuntu git 简单入门【转】
  • python selenium ---键盘事件
  • Getting started with Chrome Dev Editor
  • 五月份小结
  • VmWare5.5主机Citrix桌面实施方案(四)
  • Redis官方中文翻译系列 - Redis支持
  • 【BZOJ 1066】[SCOI2007]蜥蜴
  • div无法触发blur事件解决的方法
  • 自动布局AutoLayout
  • C# 提取Word文档中的图片
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Linux经常使用命令大全
  • Shell基础整理
  • LAMP架构搭建与优化(2.5-2.7)
  • 【css3】浏览器内核及其兼容性
  • Angular数据绑定机制
  • Brief introduction of how to 'Call, Apply and Bind'
  • Git初体验
  • JavaScript HTML DOM
  • JS+CSS实现数字滚动
  • JSDuck 与 AngularJS 融合技巧
  • Python中eval与exec的使用及区别
  • vue-cli3搭建项目
  • vuex 笔记整理
  • web标准化(下)
  • 读懂package.json -- 依赖管理
  • 复杂数据处理
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 进程与线程(三)——进程/线程间通信
  • # include “ “ 和 # include < >两者的区别
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Java)【深基9.例1】选举学生会
  • (ZT)一个美国文科博士的YardLife
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • ***检测工具之RKHunter AIDE
  • ***利用Ms05002溢出找“肉鸡
  • .Net 6.0 处理跨域的方式
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET6实现破解Modbus poll点表配置文件
  • @Builder用法
  • @vue/cli 3.x+引入jQuery
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [1] 平面(Plane)图形的生成算法
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured