OpenCV检测Marker位姿
- Marker检测采用小觅相机,可以实时检测Marker的位置和姿态,效果如下:
参考代码如下:
#include "pch.h" #include <Eigen/Dense>
#include <opencv2/core.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\aruco.hpp>
#include <opencv2\aruco\dictionary.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp> #include <mynteyed/camera.h>
#include <mynteyed/utils.h> #include <vector>
#include <iostream>
#include <Windows.h>
#include <fstream> using namespace std;
using namespace cv;
using namespace Eigen;
using namespace aruco; int main(int argc, char *argv[]) {
mynteyed::Camera cam;
mynteyed::DeviceInfo dev_info;
if (!mynteyed::util::select(cam, &dev_info)) {
return ;
}
mynteyed::util::print_stream_infos(cam, dev_info.index); std::cout << "Open device: " << dev_info.index << ", "
<< dev_info.name << std::endl << std::endl;
//设置相机的参数
mynteyed::OpenParams params(dev_info.index);
//params.depth_mode = mynteyed::DepthMode::DEPTH_GRAY;
//params.stream_mode = mynteyed::StreamMode::
params.stream_mode = mynteyed::StreamMode::STREAM_2560x720;
params.color_mode = mynteyed::ColorMode::COLOR_RECTIFIED;
//params.ir_intensity = 4;
params.framerate = ; cam.Open(params); Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(aruco::DICT_6X6_250);
Mat out;
dictionary->drawMarker(, , out, ); Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create(); for (;;) {
auto Left_color = cam.GetStreamData(mynteyed::ImageType::IMAGE_LEFT_COLOR);
if (Left_color.img)
{
Mat image = Left_color.img->To(mynteyed::ImageFormat::COLOR_BGR)->ToMat();
Mat imageCopy;
//相机内参矩阵
const Mat intrinsic_matrix = (Mat_<float>(, )
<< 713.12554931640625000, 0.0, 634.99163818359375000, 0.0,
714.41278076171875000, 363.88098144531250000, 0.0, 0.0, 1.0); //畸变校正
const Mat arucodistCoeffs = (Mat_<float>(, ) << -0.29668807983398438, 0.07767868041992188,
0.00000000000000000, -0.00012969970703125,
0.00000000000000000);
vector< int > ids;
vector< vector< Point2f > > corners, rejected;
vector< Vec3d > rvecs, tvecs;
Mat R;
MatrixXd M(, );
// detect markers and estimate pose
detectMarkers(image, dictionary, corners, ids, detectorParams, rejected);//rejected拒绝的矩形区域
image.copyTo(imageCopy);
if (ids.size() > )
{
drawDetectedMarkers(imageCopy, corners, ids);
std::vector <cv::Vec3d> rvecs,tvecs;
estimatePoseSingleMarkers(corners,0.05, intrinsic_matrix, arucodistCoeffs, rvecs, tvecs);
//0.05为Marker的大小
Rodrigues(rvecs[], R, noArray());//罗德里格斯变换将旋转矩阵变为旋转向量
MatrixXd r(, );
VectorXd t();
VectorXd T_mm();
cv2eigen(R, r);
cv2eigen(tvecs[], t);
cv2eigen(tvecs[], T_mm);
T_mm = T_mm * ;
M(, ) = r(, ); M(, ) = r(, ); M(, ) = r(, ); M(, ) = t(, );
M(, ) = r(, ); M(, ) = r(, ); M(, ) = r(, ); M(, ) = t(, );
M(, ) = r(, ); M(, ) = r(, ); M(, ) = r(, ); M(, ) = t(, );
M(, ) = ; M(, ) = ; M(, ) = ; M(, ) = ; cout << "R :" << r << endl;
cout << "T :" << T_mm << endl; for (int i = ; i < ids.size(); i++)
{
cv::aruco::drawAxis(imageCopy, intrinsic_matrix, arucodistCoeffs, rvecs[i], tvecs[i], 0.05);
} } imshow("out", imageCopy);
char key = (char)waitKey();
if (key == ) break;
} }
return ;
}
OpenCV检测Marker位姿的更多相关文章
- 用 Python 和 OpenCV 检测图片上的条形码
用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...
- 用 Python 和 OpenCV 检测图片上的条形码(转载)
原文地址:http://python.jobbole.com/80448/ 假设我们要检测下图中的条形码: # load the image and convert it to grayscale 1 ...
- 利用OpenCV检测图像中的长方形画布或纸张并提取图像内容
基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢 ...
- OpenCV检测人脸实例代码
下面是使用OpenCV通过在硬盘中读入图像来对其进行Haar人脸检测的代码. //包含头文件 #include <opencv2/core/core.hpp> #include " ...
- 【转】opencv检测运动物体的基础_特征提取
特征提取是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连 ...
- 利用OpenCV检测手掌(palm)和拳头(fist)
思路:利用训练好的palm.xml和fist.xml文件,用OpenCV的CascadeClassifier对每一帧图像检测palm和fist,之后对多帧中检测到的palm和fist进行聚类分组,满足 ...
- 用opencv检测人眼并定位瞳孔位置
最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码.总结如下: 1) 定位瞳孔可以直接使用opencv中的自带的分类器(haarcascade_eye_tree_eyeglasses.xml)来 ...
- (转)使用Python和OpenCV检测图像中的物体并将物体裁剪下来
原文链接:https://blog.csdn.net/liqiancao/article/details/55670749 介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的 ...
- 深入学习OpenCV检测及分割图像的目标区域
准备1:OpenCV常用图片转换技巧 在进行计算机视觉模型训练前,我们经常会用到图像增强的技巧来获取更多的样本,但是有些深度学习框架中的方法对图像的变换方式可能并不满足我们的需求,所以掌握OpenCV ...
随机推荐
- SpringBoot_Web开发_定制错误数据
SpringBoot默认的错误处理机制 默认效果: 1).浏览器,返回一个默认的错误页面 2).如果是其他客户端,默认响应一个json数据 原理: 可以参照ErrorMvcAutoConfig ...
- SpringBoot实现简单的CRUD
CRUD-员工列表 实验要求: 1).RestfulCRUD:CRUD满足Rest风格: URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作 2).实验的请求架构; 3).员工列表 ...
- ios---cocoapods 安装与使用 (AFNetworking为例)
cocoapods 安装与使用 一.CocoaPods是什么? CocoaPods是一个用Ruby写的.负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中的.统一管理第三方开源库, ...
- ios--->帧动画
帧动画 NSMutableArray<UIImage *> *imageArr=[NSMutableArray array]; for(int i=0;i<20;i++){ NSSt ...
- Kubernetes学习(二)
二 POD生命周期 initC作用说明 initC举例说明 init-pod.yaml apiVersion: v1kind: Podmetadata: name: myapp-pod labels: ...
- python学习Day7--字符串操作
[主要内容] 1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 2. 列表不能再循环的时候删除. 因为索引会跟着改变 3. 字典也不能直接循环删除. 把要删除的内容记 ...
- TortoiseSVN使用教程[多图超详细]
安装及下载client 端 下载Windows 端程序:http://tortoisesvn.net/downloads.一般而言,如果是32-bit的Windows XP 应该使用TortoiseS ...
- JSP&Servlet学习笔记----第4章
HTTP是基于请求/响应的无状态的通信协议. 使服务器记得此次请求与之后请求关系的方式,叫做会话管理. 隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息.仅适用于一些简单的状态 管理,如 ...
- FFMPEG学习----解码视频
基础概念 我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的容器格式规定了其中音视频数据的组织方式(也包括其他 ...
- Windows 7中的“帮助和支持”无法打开怎么办?
win7 X64 将下面的代码导入注册表 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.xml] @="xmlfile&q ...