距离的界说是一个宽泛的概念,只要知足非负、自反、三角不等式就可以称之为距离。
范数是一种强化了的距离概念,它在界说上比距离多了一条数乘的运算法例。有时辰为了便于理解,我们可以把范数看成距离来理解。
在数学上,范数包罗标的目的量范数和矩阵范数,标的目的量范数表征标的目的量空间中标的目的量的巨细,矩阵范数表征矩阵引起转变的巨细。
一种非严密的诠释就是,对应标的目的量范数,标的目的量空间中的标的目的量都是有巨细的,这个巨细若何怀抱,就是用范数来怀抱的,分歧的范数都可以来怀抱这个巨细,就比如米和尺都可以来怀抱远近一样;对于矩阵范数,学过线性代数,我们知道,经由过程运算AX=B,可以将标的目的量X转变为B,矩阵范数就是来怀抱这个转变巨细的。
本文本家儿要介绍:
OpenCV矩阵暗示形式,
范数界说;
范数性质;
OpenCV三种范数格局;
应用实例;
数学概念;

东西/原料
- opencv 2410
方式/步调
- 1
OpenCV中矩阵暗示形式:
CV_8UC1:一个8位无符号整型单通道矩阵,
CV_32FC2:一个32位浮点型双通道矩阵,
CV_8UC1 CV_8SC1 CV_16UC1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
通道暗示每个点能存放几多个数,近似于RGB彩色图中的每个像素点有三个值,即三通道。
图像中的深度暗示每个值由几多位来存储,是一个精度问题,
一般图像是8bit(位)的,则深度是8。
- 2
范数的界说║x║:
设,知足
①正心猿意马性:║x║≥0,║x║=0 if x=0
②齐次性:║cx║=│c│║x║,
③三角不等式:║x+y║≤║x║+║y║
则称Cn中界说了标的目的量范数,║x║为标的目的量x的范数.
- 3
范数的性质:
标的目的量范数是标的目的量的一种具有特别性质的实值函数。
常用标的目的量范数有,令x=( x1, x2, … ,xn)T
1-范数:║x║1=│x1│+│x2│+…+│xn│//标的目的量中的绝对值乞降
2-范数:║x║2=(│x1│2+│x2│2+…+│xn│2)^1/2 //欧几里得距离
∞-范数:║x║∞=max(│x1│,│x2│, … ,│xn│) //标的目的量中的max
- 4
OpenCV:norm范数求解函数
三种格局:
①double norm(InputArray src1,
int normType=NORM_L2,
InputArray mask=noArray() )
②double norm(InputArray src1,
InputArray src2,
int normType=NORM_L2,
InputArray mask=noArray())
③double norm(const SparseMat& src, int normType)
- 5
应用实例:用于评估相机标心猿意马的表里参质量
法式如下:
cout << "每幅图像的标心猿意马误差:" << endl;
for (int i = 0; i<image_count; i++)
{
vector<Point3f> tempPointSet = object_Points[i];
/*object_Points是图像棋盘格角点宿世界坐标的容器,其是三通道的XYZ,此中Z通道为0。棋盘格以左上角为原点,方块巨细是12mm和12mm*/
/*依据摄像机表里参数,对空间的三维点进行重投影计较;
tempPointSet为12mm*12mm的棋盘格标心猿意马板角点宿世界坐标,
image_points2是重投影后的图像像素角点坐标*/
projectPoints(tempPointSet,
rotation_vectors[i],
translation_vectors[i],
intrinsic_matrix,
distortion_coeffs,
image_points2);
/*图像亚像素角点坐标tempImagePoint */
/*image_points2和tempImagePoint进行误差计较,评估出其表里参的质量*/
vector<Point2f> tempImagePoint = corners_Seq[i];
//界说双通道的Mat矩阵,每个点暗示两个数据,别离为棋盘格角点的x和y//
Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2);
Mat image_points2Mat = Mat(1, image_points2.size(), CV_32FC2);
for (int j = 0; j < tempImagePoint.size(); j++)
{
image_points2Mat.at<Vec2f>(0, j) = Vec2f(image_points2[j].x, image_points2[j].y); //两个通道赋值
tempImagePointMat.at<Vec2f>(0, j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);
}
err = norm(image_points2Mat, tempImagePointMat, NORM_L2);//2范数
total_err += err /= point_counts[i];
cout << "第" << i + 1 << "幅图像的平均误差:" << err << "像素" << endl;
}
cout << "总体平均误差:" << total_err / image_count << "像素" << endl;
cout << "评价完当作!" << endl;
【注】:OpenCV的norm函数是将两个通道分隔计较(X1-X2)^2的值,然后同一乞降,开根号;即2范数;
- 6
数学概念(弥补)
例如:
Mat common_point1 = Mat(1, 3, CV_32FC2);
Mat cur_point1 = Mat(1, 3, CV_32FC2);
for (size_t i = 0; i < 3; i++)
{
common_point1.at<Vec2f>(0, i) = Vec2f(6, 5);
cur_point1.at<Vec2f>(0, i) = Vec2f(4,4);
}
err = norm(common_point1, cur_point1, NORM_L2);
printf("err为 : %f个像素 \n", err);
成果为:sqrt((6-4)^2+(5-4)^2+(6-4)^2+(5-4)^2+(6-4)^2+(5-4)^2)=3.87
注重事项
- 【注】: 问题:为什么不将图像像素坐标经由过程表里参转换为宿世界物理坐标?
- 这是因为当把图像像素坐标转换为宿世界坐标时,是一条射线,无法还原出深度Z;
来源:百闻(微信/QQ号:9397569),转载请保留出处和链接!
本文链接:https://www.ibaiwen.com/web/240026.html
- 上一篇: 光盘怎么安装系统
- 下一篇: 如何在Mac上更改邮件中的默认电子邮件地址
- 热门文章
-
WB蒙特利尔(WB Montreal)——欧美十大最差视频游戏开发商
迅猛龙(Velociraptor)——欧美史前十大死亡动物
什么是果酱猫(What Marmalade Cats)?
神奇蜘蛛侠2(The Amazing Spider-Man 2)——欧美最佳蜘蛛侠电影
希瑟(Heather)——欧美十大最佳柯南灰歌
二人梭哈
faceu激萌怎么把瘦脸开到最大
奥兹奥斯本(Ozzy Osbourne)——欧美十大高估歌手
什么是小脑前下动脉(Anterior Inferior Cerebellar Artery)?
我应该知道康涅狄格州的什么(What Should I Know About Connecticut)?
- 热评文章
- 最新评论
-
- 最近访客
-
- 站点信息
-
- 文章总数:200248
- 页面总数:9
- 分类总数:1
- 标签总数:0
- 评论总数:0
- 浏览总数:497