距離的界說是一個寬泛的概念,只要知足非負、自反、三角不等式就可以稱之為距離。
范數是一種強化了的距離概念,它在界說上比距離多了一條數乘的運算法例。有時辰為了便于理解,我們可以把范數看成距離來理解。
在數學上,范數包羅標的目的量范數和矩陣范數,標的目的量范數表征標的目的量空間中標的目的量的巨細,矩陣范數表征矩陣引起轉變的巨細。
一種非嚴密的詮釋就是,對應標的目的量范數,標的目的量空間中的標的目的量都是有巨細的,這個巨細若何懷抱,就是用范數來懷抱的,分歧的范數都可以來懷抱這個巨細,就比如米和尺都可以來懷抱遠近一樣;對于矩陣范數,學過線性代數,我們知道,經由過程運算AX=B,可以將標的目的量X轉變為B,矩陣范數就是來懷抱這個轉變巨細的。
本文本家兒要介紹:
OpenCV矩陣暗示形式,
范數界說;
范數性質;
OpenCV三種范數格局;
應用實例;
數學概念;
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。
范數的界說║x║:
設,知足
①正心猿意馬性:║x║≥0,║x║=0 if x=0
②齊次性:║cx║=│c│║x║,
③三角不等式:║x+y║≤║x║+║y║
則稱Cn中界說了標的目的量范數,║x║為標的目的量x的范數.
范數的性質:
標的目的量范數是標的目的量的一種具有特別性質的實值函數。
常用標的目的量范數有,令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
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)
應用實例:用于評估相機標心猿意馬的表里參質量
法式如下:
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范數;
數學概念(彌補)
例如:
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
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!