opencv找直線及直線交點

opencv2.4.9 & VS2013環(huán)境

一個簡單的問題:

在圖中找出兩條直線锋爪,并找到兩條直線交點位置丙曙。


1.jpg

思路:

  1. 讀圖,二值化其骄,簡單腐蝕亏镰,之后直線在原圖中比較明顯,所以考慮直接用霍夫變換尋找直線拯爽。

  2. 霍夫直線檢測可能會檢測出多條重疊直線索抓,利用上下兩部分直線斜率相反篩選一下,選出兩條直線。

3)兩條直線求交點逼肯,變?yōu)榻舛淮畏匠虇栴}耸黑。

4)畫出結果

實現(xiàn):

1)調用opencv中的HoughLinesP函數(shù):


void HoughLinesP( InputArray image, OutputArray lines,

double rho, double theta, int threshold,

double minLineLength=0, double maxLineGap=0 );

image為輸入圖像,要求是8位單通道圖像

lines為輸出的直線向量篮幢,每條線用4個元素表示大刊,即直線的兩個端點的4個坐標值

rho和theta分別為距離和角度的分辨率

threshold為閾值,即步驟3中的閾值

minLineLength為最小直線長度三椿,在步驟5中要用到缺菌,即如果小于該值,則不被認為是一條直線

maxLineGap為最大直線間隙赋续,在步驟4中要用到男翰,即如果有兩條線段是在一條直線上,但它們之間因為有間隙纽乱,所以被認為是兩個線段蛾绎,如果這個間隙大于該值,則被認為是兩條線段鸦列,否則是一條租冠。

2)檢測出的直線為Vec4i類型,一共四位數(shù)薯嗤。分別代表直線上的(x1,y1,x2,y2)顽爹,求出每條直線寫了,Ka * kB<0即代表兩條直線鞋履相反

3)利用四個點坐標解方程骆姐,返回point2f類型的一個點

4)利用Line()以及circle()函數(shù)畫出圖像

上代碼:

/*Copyright:ZhenYM @ Harbin Institute of Technology; Nov,29, 2017*/
# include <opencv2/opencv.hpp>  
# include <iostream>  

using namespace cv;
using namespace std;

/*函數(shù)功能:求兩條直線交點*/
/*輸入:兩條Vec4i類型直線*/
/*返回:Point2f類型的點*/
Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
{
    double ka, kb;
    ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率
    kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率

    Point2f crossPoint;
    crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);
    crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);
    return crossPoint;
}

int main(){

    Mat src, grayImg, binImg, result;
    src = imread("./1.jpg");
    //imshow("srcimage", src);
    //waitKey(30);

    /*檢查圖像是否載入*/
    if (src.empty()) {
        printf("Error Loading Image...\n");
        return -1;
    }

    /*轉為灰度圖*/
    if (src.channels() == 3){
        cvtColor(src, grayImg, CV_BGR2GRAY);
    }
    else if (src.channels() == 2){
        grayImg = src.clone();
    }

    /*二值化*/
    threshold(grayImg, binImg, 100, 255, THRESH_BINARY);
    //adaptiveThreshold(grayImg, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    //imshow("binary image", binImg);
    //waitKey(100);

    /*腐蝕*/
    Mat element = getStructuringElement(MORPH_RECT, Size(2, 1));
    Mat erodeImg; 
    erode(binImg, erodeImg, element);
    //imshow("erode", erodeImg);
    //waitKey(100);

    /*霍夫直線檢測*/
    vector<Vec4i> Lines;
    HoughLinesP(erodeImg, Lines, 1, CV_PI / 360, 200, 100, 10);
    Vec4i LineStand = Lines[0];
    Vec4i LineAnother;
    double ka = (double)(LineStand[1] - LineStand[3]) / (double)(LineStand[0] - LineStand[2]);
    double kb;
    for (int i = 1; i < Lines.size(); i++)
    {
        double ki = (double)(Lines[i][1] - Lines[i][3]) / (double)(Lines[i][0] - Lines[i][2]);
        if (ki*ka < 0)        
        {
            LineAnother = Lines[i];
            kb = ki;
        }
    }

    /*畫出兩條直線*/
    result = src.clone();
    line(result, Point(LineStand[0], LineStand[1]), Point(LineStand[2], LineStand[3]), Scalar(0, 255, 0), 2, 8);
    line(result, Point(LineAnother[0], LineAnother[1]), Point(LineAnother[2], LineAnother[3]), Scalar(0, 0, 255), 2, 8);
    cout << "直線A過點(" << LineStand[0] << "," << LineStand[1] << ")以及點(" << LineStand[2]<<"镜粤,"<<LineStand[3] << ");斜率為:" << ka << endl;
    cout << "直線B過點(" << LineAnother[0] << "玻褪," << LineAnother[1] << ")以及點(" << LineAnother[2] << "肉渴," << LineAnother[3] << ");斜率為:" << kb << endl;

    /*求交點并畫點保存带射,result.jpg存儲在工程目錄下*/
    Point2f crossPoint;
    crossPoint = getCrossPoint(LineStand, LineAnother);
    circle(result, crossPoint, 6, Scalar(255, 0, 0));
    imwrite("./result.jpg", result);
        cout << "Copyrigth@zym" << endl;
    cout << "交點坐標為:" << crossPoint << endl;
    imshow("result", result);
    waitKey(100);
    system("pause");

    return 0;
}

運行結果:


result.jpg

consolew.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末同规,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窟社,更是在濱河造成了極大的恐慌券勺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灿里,死亡現(xiàn)場離奇詭異关炼,居然都是意外死亡,警方通過查閱死者的電腦和手機钠四,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門盗扒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跪楞,“玉大人缀去,你說我怎么就攤上這事侣灶。” “怎么了缕碎?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵褥影,是天一觀的道長。 經(jīng)常有香客問我咏雌,道長凡怎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任赊抖,我火速辦了婚禮统倒,結果婚禮上,老公的妹妹穿的比我還像新娘氛雪。我一直安慰自己房匆,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布报亩。 她就那樣靜靜地躺著浴鸿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弦追。 梳的紋絲不亂的頭發(fā)上岳链,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音劲件,去河邊找鬼掸哑。 笑死,一個胖子當著我的面吹牛零远,可吹牛的內容都是我干的苗分。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遍烦,長吁一口氣:“原來是場噩夢啊……” “哼俭嘁!你這毒婦竟也來了?” 一聲冷哼從身側響起服猪,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤供填,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罢猪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近她,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年膳帕,在試婚紗的時候發(fā)現(xiàn)自己被綠了粘捎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薇缅。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖攒磨,靈堂內的尸體忽然破棺而出泳桦,到底是詐尸還是另有隱情,我是刑警寧澤娩缰,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布灸撰,位于F島的核電站,受9級特大地震影響拼坎,放射性物質發(fā)生泄漏浮毯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一泰鸡、第九天 我趴在偏房一處隱蔽的房頂上張望债蓝。 院中可真熱鬧,春花似錦盛龄、人聲如沸饰迹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹦锋。三九已至,卻和暖如春欧芽,著一層夾襖步出監(jiān)牢的瞬間莉掂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工千扔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憎妙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓曲楚,卻偏偏與公主長得像厘唾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子龙誊,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容

  • 本文轉自 python數(shù)字圖像處理 霍夫線變換 在圖片處理中抚垃,霍夫變換主要是用來檢測圖片中的幾何形狀,包括直線趟大、圓...
    jiandanjinxin閱讀 33,407評論 6 23
  • 遠遠的鹤树,淡淡的清香 如水般輕輕地抖落 我用明潔的齒唇 暗暗地將他埋葬 道一...
    獨孤守望閱讀 208評論 1 4
  • 小生篇 我是小生。 我住在西南邊陲的一個小城里逊朽。這里山高林密罕伯,空氣很好,雨后路邊總是會爬出小螃蟹叽讳,爺爺常拿上小水桶...
    大若木木閱讀 511評論 3 5
  • CALayer類在概念上和UIView類似追他,同樣也是一些被層級關系樹管理的矩形塊坟募,同樣也可以包含一些像圖片,文本或...
    HeartPower閱讀 1,227評論 2 4
  • (部分圖片來自于空間) 由于自己所處年代的特殊邑狸,所以懈糯,除了讀書之外,我?guī)缀醪粫鋈魏渭覄胀评!杉覄盏娜硕剂w慕我...
    快樂的生活閱讀 186評論 0 0