如何获得物体的主要方向?

问题来源为网友提供的资料,原文地址为:《Object Orientation, Principal Component Analysis & OpenCV》

问题描述:
对于这样的图像(2副,采用了背投光),如何获得上面工件的主要方向
pca_test1 
pca_test2
主要思路:
1、分别获得每个工件的轮廓;
2、处理每个轮廓,采用pca(主成分分析)方法,获得所有轮廓点的集合的中点,主要方向等信息;
3、绘图并返回结果。
 
注:pca相关函数请查看
https://docs.opencv.org/master/d3/d8d/classcv_1_1PCA.html
代码略解:
1、读入图片,寻找轮廓;
//读入图像,转换为灰度
    Mat img = imread("e:/sandbox/pca1.jpg");
    Mat bw;
    cvtColor(img, bw, COLOR_BGR2GRAY);
    //阈值处理
    threshold(bw, bw, 150255, CV_THRESH_BINARY);
    //寻找轮廓
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
2、首先以大小筛选轮廓;
//轮廓分析,找到工件
    for (size_t i = 0; i < contours.size(); ++i)
    {
        //计算轮廓大小
        double area = contourArea(contours[i]);
        //去除过小或者过大的轮廓区域(科学计数法表示)
        if (area < 1e2 || 1e5 < area) continue;
        //绘制轮廓
        drawContours(img, contours, i, CV_RGB(25500), 28, hierarchy, 0);
        //寻找每一个轮廓的方向
        getOrientation(contours[i], img);
    }
3、单独处理每个轮廓,分析其主要方向,绘制结果
//获得构建的主要方向
double getOrientation(vector<Point> &pts, Mat &img)
{
    //构建pca数据。这里做的是将轮廓点的x和y作为两个维压到data_pts中去。
    Mat data_pts = Mat(pts.size(), 2, CV_64FC1);//使用mat来保存数据,也是为了后面pca处理需要
    for (int i = 0; i < data_pts.rows; ++i)
    {
        data_pts.at<double>(i, 0= pts[i].x;
        data_pts.at<double>(i, 1= pts[i].y;
    }
    //执行PCA分析
    PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);
    //获得最主要分量,在本例中,对应的就是轮廓中点,也是图像中点
    Point pos = Point(pca_analysis.mean.at<double>(00),pca_analysis.mean.at<double>(01));
    //存储特征向量和特征值
    vector<Point2d> eigen_vecs(2);
    vector<double> eigen_val(2);
    for (int i = 0; i < 2++i)
    {
        eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0),pca_analysis.eigenvectors.at<double>(i, 1));
        eigen_val[i] = pca_analysis.eigenvalues.at<double>(i,0);//注意,这个地方原代码写错了
    }
    //在轮廓/图像中点绘制小圆
    circle(img, pos, 3, CV_RGB(2550255), 2);
    //计算出直线,在主要方向上绘制直线
    line(img, pos, pos + 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]) , CV_RGB(2552550));
    line(img, pos, pos + 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]) , CV_RGB(0255255));
    //返回角度结果
    return atan2(eigen_vecs[0].y, eigen_vecs[0].x);
}
结果展示:
感谢关注,希望有所帮助。
此外,特别感谢:https://github.com/NickeManarin/ScreenToGif/wiki/Help
提供的这个gif录屏软件,非常好用。

 

转载于:https://www.cnblogs.com/jsxyhelu/p/7690699.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的开源免费办公软件,开源免费Office办公套件(LibreOffice)

LibreOffice是一款全面的开源免费Office办公套件&#xff0c;软件拥有强大的数据导入和导出功能&#xff0c;能直接导入 PDF 文档、微软 Works、LotusWord&#xff0c;支持主要的 OpenXML 格式。软件本身并不局限于 Debian 和Ubuntu 平台&#xff0c;支持 Windows、Mac、PRM pa…

ubuntu安装ftp_如何在 Ubuntu 20.04 上安装 Webmin

本文最先发布在&#xff1a; 如何在 Ubuntu 20.04 上安装 Webmin​www.itcoder.techWebmin 是一个开源控制面板&#xff0c;它允许你通过简单易用的 Web 界面&#xff0c;就可以管理你的 Linux 服务器。它允许你管理用户&#xff0c;组&#xff0c;磁盘配额&#xff0c;创建文件…

c++ auto用法_不想写表达式的类型?试试auto吧

作者&#xff1a;守望&#xff0c;Linux应用开发者&#xff0c;目前在公众号【编程珠玑】 分享Linux/C/C/数据结构与算法/工具等原创技术文章和学习资源。前言你以为我说的自动变量类型auto吗&#xff1f;非也&#xff0c;我们知道C语言中其实也有auto关键字&#xff0c;它和早…

浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别

最近在看NVMeDirect和SPDK的源码&#xff0c;觉得有必要梳理一下MMIO和PMIO的区别。关于MMIO和PMIO&#xff0c;维基百科上是这么讲滴&#xff0c; Memory-mapped I/O (MMIO) and port-mapped I/O (PMIO) (which is also called isolated I/O) are two complementary methods o…

linux sftp密码错误,linux个别用户sftp坏掉,验证密码后卡住, 大概是什么问题?...

问题描述linux个别用户sftp坏掉&#xff0c;验证密码后卡住&#xff0c; 大概是什么问题&#xff1f;所有采用sftp的软件都不能用了winsshfs 点击mount后就卡住xftp 连接验证结束后也卡住sublimeText3 的sftp插件也不好用了突然发生的情况之前一直用着都没有问题一直正常使用 只…

c语言 结构体_C语言 技能提升 系列文章 (三)结构体

今天&#xff0c;来跟大家聊一聊C语言中的结构体。在C语言的各种数据类型中&#xff0c;结构体最特别&#xff0c;因为它是可以被程序员定义的&#xff0c;它的特点是非常的灵活。定义struct defined_name{type_name field_name;};结构体内部的成员可以是任意类型的数据&#x…

基于@FeignClient注解实现两个微服务之间接口的调用(简单)

场景需求&#xff1a;微服务A中的接口input需要调用微服务B中接口的output数据。 实现&#xff1a;使用feign实现即可。 微服务B中的接口&#xff1a; 步骤一&#xff1a;微服务A中编写一个接口&#xff0c;该接口就是调用微服务B的接口&#xff1b;需要在接口上添加FeignClien…

spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程

徒手撸一个扫码登录示例工程不知道是不是微信的原因&#xff0c;现在出现扫码登录的场景越来越多了&#xff0c;作为一个有追求、有理想新四好码农&#xff0c;当然得紧跟时代的潮流&#xff0c;得徒手撸一个以儆效尤本篇示例工程&#xff0c;主要用到以下技术栈qrcode-plugin&…

inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?

在面试的时候&#xff0c;ThreadLocal作为高并发常用工具经常会被问到。而面试官比较喜欢问的问题有以下两个&#xff1a;1、ThreadLocal是怎么实现来保证每个线程的变量副本的。2、ThreadLocal的内存泄露是怎么产生的&#xff0c;怎么避免内存泄露。首先我们来看第一个问题&am…

keras保存模型_TF2 8.模型保存与加载

举个例子&#xff1a;先训练出一个模型import 接下来第一种方法&#xff1a;只保留模型的参数&#xff1a;这个有2种方法&#xff1a;model.save_weights("adasd.h5")model.load_weights("adasd.h5") model.predict(x_test)model.save_weights(./checkpoin…

第一章 Burp Suite 安装和环境配置

Burp Suite是一个集成化的渗透测试工具&#xff0c;它集合了多种渗透测试组件&#xff0c;使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击。在渗透测试中&#xff0c;我们使用Burp Suite将使得测试工作变得更加容易和方便&#xff0c;即使在不需要娴熟的技巧的情…

mysql57服务无法启动_将mysqld.service服务加入到systemctl

在开始安装二进制MySQL的时候感觉都还挺好&#xff0c;就是在启动服务的时候比较麻烦&#xff0c;一开始是在Centos6下的感觉也没有什么费劲的;但是在Centos7下面还是有点不太适应&#xff0c;不过还好用用就熟悉了&#xff1b;说明一下&#xff0c;我的安装目录在/usr/local/m…

linux raid autodetect,软raid的建立

1 增加磁盘并分区(修改id)fdisk /dev/sdbCommand (m for help): pDisk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits cylinders of 16065 * 512 8225280 bytesDevice Boot Start End Blocks Id System/dev/sd…

c语言for循环的省略写法,C语言两种for循环写法分析

每个C程序员都知道同一个for循环语句可以有两种写法:A: for (i 0; i B: for (i cnt; i > 0; i--){ }前几天,DEBUG的时候, 发现采用A写法的代码反汇编出来有BUG.当时没有时间记录,环境也没有保存下来.今天尝试重现,又没来出现上次的问题...很奇怪.很久很久以前也听说过这两…

python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字

本文为大家分享了pygame游戏之旅的第5篇&#xff0c;供大家参考&#xff0c;具体内容如下 在游戏中添加显示文字&#xff1a; 这里自己定义一个crash函数接口&#xff1a; def crash(): message_diaplay(You Crashed) 然后实现接口函数message_display(text) def message_diapl…

springboot netty给特定客户端推送_Spring Boot 又升级了?2.0 你搞懂了吗?!

【小宅按】作为知名互联网公司都在用的技术&#xff0c;Spring Boot 2.0 的更新引起了很大的关注&#xff0c;本文将分为三部分解读 2.0 的更新&#xff1a;第一类&#xff0c;基础环境升级&#xff1b;第二类&#xff0c;默认软件替换和优化&#xff1b;第三类&#xff0c;新技…

OSI七层模型与TCP/IP五层模型详解

博主是搞是个FPGA的&#xff0c;一直没有真正的研究过以太网相关的技术&#xff0c;现在终于能静下心学习一下&#xff0c;希望自己能更深入的掌握这项最基本的通信接口技术。下面就开始搞了。 一、OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。…

android 自定义表情包,android基于环信的聊天和表情自定义

环信sdk的导入自定义聊天界面此处只有静态图&#xff0c;请谅解。自定义表情发送自定义聊天界面简单说下自定义的聊天界面&#xff0c;一个带有recyclerview和的xml文件&#xff0c;和对应的adapter即可。recyclerview为展示聊天信息。通过EMClient.getInstance().chatManager(…

erlang安装_RabbitMQ的使用(一)- RabbitMQ服务安装

作者&#xff1a;markjiang7m2博客园地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/12769627.html官网地址&#xff1a;http://letyouknow.netRabbitMQ&#xff0c;消息队列的一个中间件&#xff0c;这里不打算展开介绍了。此文意在记录工作中使用RabbitMQ时的过程及…

NodeJS React 开发环境搭建

1、首先需要安装NodeJS环境&#xff0c;下载NodeJS安装程序安装即可。 NodeJS下载地址&#xff1a; https://nodejs.org/en/download/ 2、安装NodeJS的web框架express npm install express-generator -g 3、创建项目 express studyReact 4、添加jsx引擎支持 npm install ex…