日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV:简单计算曲线弧度-弓形弧度

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV:简单计算曲线弧度-弓形弧度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在判斷曲線擬合度時候,需要進行曲線曲率計算。本文中使用根據弦的方法計算曲線弧度半徑,得到曲率。

首先判定是否為弧:

簡單判定:不要選取較多的點,若線段不是偏向一個方向,則不為弧

bool isArcCurve( std::vector<cv::Point> &curve ){bool isArc = false;cv::Point ps, pe,vec;ps = cv::Point(curve[0]);pe = cv::Point(curve[curve.size() - 1]);double angle0 = colorWish::arccos(ps, pe);std::vector<double > rls;//左側還是右側for (int i = 1; i < curve.size() - 1; ++i) {double angle1 = colorWish::arccos( ps, curve[i] );rls.push_back( angle1 );}//若出現一次反轉,則判定為否,以此保證曲線的單方向std::vector<bool > rlbs;for ( int i = 0; i < rls.size() ; ++i ) {bool isRight = false;if ( rls[i]>angle0 ){isRight = true;} else{isRight = false;}rlbs.push_back( isRight );}//若出現一次反轉,則判定為否,以此保證曲線的單方向bool isSinVec = false;bool isRight = false;if ( rlbs.size()>0 ){isRight = rlbs[0];for (int i = 1; i < rlbs.size(); ++i){if ( isRight!= rlbs[i]){isSinVec = true;}}}else{}isArc = isSinVec;return isArc;} double colorWish::dis2(double x1, double y1, double x2, double y2) {return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);}// 計算兩點的坐標夾角,360度余弦值double colorWish::arccos(double x0, double y0, double x1, double y1){double angle = 0;double l = dis2(x0, y0, x1, y1);l = sqrt(l);if (y1 - y0 > 0) { angle = acos((x1 - x0) / l); }else { angle = 3.141592653 + 3.141592653 - acos((x1 - x0) / l); }//std::cout << (angle) << " ";return angle;}//arccosdouble colorWish::arccos(cv::Point cneter, cv::Point p) {return arccos(double(cneter.x), double(cneter.y), double(p.x), double(p.y));}

計算弧度值:

計算弓形曲率,使用遍歷方法找弓形高(曲線上任一點),根據海倫公式計算出高

//計算弓形的曲率-此方法仍然只保證對連續點集確定有效//計算方法:兩端長度為弦長,高度為弓形高,以此計算曲率double getArcCurvity( std::vector<cv::Point> &curve ){double curvity = 0;if ( curve.size()<4 ){return 0;}cv::Point ps, pe;ps = cv::Point( curve[0] );pe = cv::Point( curve[curve.size()-1] );double lArc = disCv( ps, pe );//弦長double hArc = 0;for ( int i=1;i<curve.size()-1;++i ){double h = p2Line( curve[i],ps,pe );//點到直線的距離if (hArc<h){hArc = h;}}//曲率公式-使用R^2 = L^2 +(R-H)^2即 R= ( L^2/H +H)/2double R = 0.5*( lArc*lArc/hArc +hArc );curvity = 1 / R;return curvity;} //點 p 到線段(p1,p2)的距離-只計算三角形情況,且只計算垂直距離//使用海倫公式double p2Line(const cv::Point &p0,const cv::Point &p1, const cv::Point &p2){double dis = 0;double a, b, c, p, S,h;a = disCv(p0, p1);b = disCv(p0, p2);c = disCv(p1, p2);p = (a + b + c)/2;S = sqrt(p*(p-a)*(p - b)*(p - c) );h = S * 2 / a;dis = h ;return dis;} double disCv(const cv::Point2f &p1, const cv::Point2f &p2){double dis = 0;dis = sqrt((p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y));return dis;}

弓形弧度半徑公式:

double R = 0.5*( lArc*lArc/hArc +hArc );
double ?curvity = 1 / R;

此種方法,比使用houghCircle方法粗糙,但簡單直觀。

尋找結果圖像:

?

?

?

?

?

總結

以上是生活随笔為你收集整理的OpenCV:简单计算曲线弧度-弓形弧度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。