前言
單目測距是通過使用單個(gè)攝像頭捕獲的圖像信息倆估計(jì)物體的距離。這是一種在計(jì)算機(jī)領(lǐng)域廣泛研究的問題,并且困難之處在于從2d圖像中恢復(fù)3d信息。
單目測距常用的或者是實(shí)用方法是相似三角形法。
相似三角形法:假設(shè)有一個(gè)寬度為w的目標(biāo)的或者物體。然后,我們用相機(jī)對物體進(jìn)行拍照并且測距物體的像素寬度p,相機(jī)焦距為f。根據(jù)相似三角形得到目標(biāo)放在距離我們相機(jī)為d的位置
d = f * w/p
圖像去畸變
圖像去畸變是使用相機(jī)校準(zhǔn)參數(shù)來修改圖像,進(jìn)而消除由于鏡頭的光學(xué)因素和相機(jī)的構(gòu)造因素導(dǎo)致的圖像畸變。
畸變主要有兩種類型:徑向畸變和切向畸變。徑向畸變是由于透鏡的形狀導(dǎo)致光線彎曲的比例變化,使得圖像看起來像在水面下觀察物體。切向畸變則是由于透鏡和成像平面之間的不平行導(dǎo)致的。
一般情況下,從攝像頭或圖像文件中讀取的原始圖像都包含一定的畸變,取決于具體的攝像頭和鏡頭參數(shù)。因此,直接讀取的圖像是原始的,畸變的。
在進(jìn)行單目測距或者其他涉及準(zhǔn)確的空間量測的計(jì)算機(jī)視覺任務(wù)中,預(yù)處理步驟通常會包括一個(gè)圖像去畸變(undistortion)的步驟。原因是攝像頭的鏡片畸變會扭曲圖像,在圖像上測得的距離可能會因此產(chǎn)生偏差。對圖像進(jìn)行去畸變可以提高測量結(jié)果的準(zhǔn)確性。
因此,進(jìn)行單目測距通常會需要一個(gè)去畸變的步驟。你需要攝像頭的校準(zhǔn)參數(shù)才能正確地去除畸變。在OpenCV中,這通常通過cv::undistort()函數(shù)來進(jìn)行,需要提供攝像頭的內(nèi)參矩陣和畸變系數(shù)。
單目測距代碼
1、基于實(shí)際物體的高度或者寬度的單目測距
單目測距使用的方法大多數(shù)是通過參照物,即已知實(shí)際物體的高度或者寬度來進(jìn)行測距。但是這種方法的缺點(diǎn)必須要已經(jīng)實(shí)際物體的高度或者寬度。
double calculateDistance(double &objectHeight, double &imageHeight, double &focalLength)
{
// 距離 = 相機(jī)的焦距(像素)* 物體的實(shí)際高度(米)/ 物體在圖像上的成像高度(像素) //* 相機(jī)傳感器的單位像素高度(米)
double distance = (focalLength * objectHeight) / (imageHeight);
return distance;
}
2、基于相機(jī)安裝高度的單目測距
相機(jī)文章來源:http://www.zghlxwxcb.cn/news/detail-824885.html
cv::Point3f MonocularRanging(int x0, int y0)
{
/*
x1為檢測框左上角x坐標(biāo),x2為檢測框右下角x坐標(biāo),y2為檢測框右下角y坐標(biāo);
取檢測框底邊中點(diǎn)作為單目測距點(diǎn)輸入。
y
|
|
x <-------
*/
//RGB相機(jī)相關(guān)參數(shù)
float Theta = 97.5 / 2; //水平視場角一半
float Beta = 79.4 / 2; //垂直視場角一半
float Alpha = 10; //10; //相機(jī)安裝仰角
float Mh = 46.52; //相機(jī)安裝高度 前撞:55.2, //相機(jī)安裝高度 機(jī)身:50.5,//紅外回充46.52
// Opencv
cv::Mat CameraMatrix = (cv::Mat_<float>(3,3) << 2.9489061908999292e+02, 0., 3.1866700927076226e+02,
0., 2.9491166478751404e+02, 2.4225251338364708e+02,
0., 0., 1.);
cv::Mat DistCoeffs = (cv::Mat_<float>(1,5) << 1.2105428797704496e-02, -1.9610247948251138e-02, 4.2034414972305298e-04, 4.9760569760944572e-04, 0.);
float Tt = Theta * PI / 180.;
float Bt = (Beta + pitch) * PI / 180.;
float x, y, kx, ky;
double a, b;
double py = abs(ky - CameraMatrix.at<float>(1, 2));
double px = CameraMatrix.at<float>(0, 2) - kx;
a = atan(tan(Bt) * py / CameraMatrix.at<float>(1, 2)) * 180 / PI;
//b = (90 - a - Alpha) * PI / 180;//相機(jī)為俯角時(shí)
b = (a - Alpha) * PI / 180;//相機(jī)為仰角時(shí)
y = Mh / tan(b);
y = abs(y);
x = tan(Tt) * px * hypot(Mh,y) / CameraMatrix.at<float>(0, 2);
cv::Point3f point;
point.x = x * 1e-3;
point.y = y * 1e-3;
point.z = 0;
return point;
參考鏈接:
1、https://zhuanlan.zhihu.com/p/642601409文章來源地址http://www.zghlxwxcb.cn/news/detail-824885.html
到了這里,關(guān)于單目測距實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!