相机标记[置顶] OpenCV for Ios 学习笔记(6)-标记检测3
时光紧张,先记一笔,后续优化与完善。
本文原始址地:OpenCV for Ios 学习条记(6)-标记测检3
标记位置的精细化
//根据相机的旋转,整调标记的姿态
//marker:捕获到的标记
std::rotate(marker.points.begin(), marker.points.begin() + 4 - nRotations, marker.points.end());
在捕获到标记后并且根据标记编码筛选后,我们该应重新定义它们的角。这步有助于面下估计标记的3d态形。
std::vector<cv::Point2f> preciseCorners(4 * goodMarkers.size());
//找到全部标记的角点
for (size_t i=0; i<goodMarkers.size(); i++)
{
const Marker& marker = goodMarkers[i];
for (int c = 0; c <4; c++)
{
preciseCorners[i*4 + c] = marker.points[c];
}
}
//类型
/*
CV_TERMCRIT_ITER 用大最迭代次数作为止终条件
CV_TERMCRIT_EPS 用精度作为迭代条件
CV_TERMCRIT_ITER+CV_TERMCRIT_EPS 用大最迭代次数或者精度作为迭代条件,决定于哪个条件先满意
*/
//迭代的大最次数
//特定的阀值
cv::TermCriteria termCriteria = cv::TermCriteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, 30, 0.01);
//输入图像
//输入的角点,也作为输出更确精的角点
//亲近的小大(Neighborhood size)
//Aperture parameter for the Sobel() operator
//像素迭代(扩大)的方法
cv::cornerSubPix(grayscale, preciseCorners, cvSize(5,5), cvSize(-1,-1), termCriteria);
// 保存最新的点顶
for (size_t i=0; i<goodMarkers.size(); i++)
{
Marker& marker = goodMarkers[i];
for (int c=0;c<4;c++)
{
marker.points[c] = preciseCorners[i*4 + c];
}
}
我们到得的图像该应像这样:

但是须要意注一点,我们在标记测检的初期的阶段没有用应cornerSubPix数函是因为它的复杂性-调用这个数函处置大批点顶时会消耗大批的处置时光,因此我们只在处置有效标记时用应。
描写标记的3维态形
总所周知,增强实现技巧是将实现界世与虚拟物体完善融合。为了将物体呈现到3维间空中,我们必须晓得它于对相我们正在行进帧捕获的相机的姿态。因此,我们将会在笛卡尔坐标系中用应欧几里得转换来示表这个姿态。
标记在3维间空的位置和它本身的投影矩阵有以下关联:
P = A * [R|T] * M;
其中:
M示表一个3维的点
[R|T] 示表一个[3|4]的欧几里得矩阵
A示表一个相机矩阵或者固有的矩阵数参
P示表M在屏幕间空中的投影

在我们实现标记标记测检,并且到得它在2维间空的4个角点(屏幕间空投影),下一步我们就要取获A矩阵和M向量数参并算计欧几里得矩阵变换。
Camera Calibration and 3D Reconstruction
相机准校
每一个相机都有具特独的数参,如焦距、主点,和镜头畸变模型。
找出相机内涵数参的程过就是相机准校。因为相机准校描述了透视变换和在输出图像上的镜头畸变,因此对增强实现用应至关重要。为了得取最好的用户体验,增强实现中的物体也该应用应同相的透视投影。
为了准校相机,我们须要一个特别的图案(棋盘或者白色景背上的色黑圆圈)。面下是实现相机准校的一个较好的法算:

为了示展相机准校,我们建创CameraCalibration类:
/**
* 一个相机准校类,存储相机的内涵数参和畸变向量
*/
class CameraCalibration
{
public:
CameraCalibration();
CameraCalibration(float fx, float fy, float cx, float cy);
CameraCalibration(float fx, float fy, float cx, float cy, float distorsionCoeff[4]);
void getMatrix34(float cparam[3][4]) const;
const Matrix33& getIntrinsic() const;
const Vector4& getDistorsion() const;
private:
Matrix33 m_intrinsic;
Vector4 m_distorsion;
};
体具实现:
待传
接链:
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
注:该学习条记重要翻译自Mastering OpenCV with Practical Computer Visi
文章结束给大家分享下程序员的一些笑话语录:
程序员打油诗
写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱。
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年。
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员。
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员。

浙公网安备 33010602011771号