1. 程式人生 > >opencv系列之一 利用透視變換實現影象的俯檢視(正檢視)

opencv系列之一 利用透視變換實現影象的俯檢視(正檢視)

課題需要,前段時間一直在研究鳥瞰圖,因為當攝像機和目標物有一個傾斜角的時候,採集到的影象會有一個透視畸變,而我們做影象處理,需要得到的是感興趣部分的正檢視,如下面兩幅圖所示。而我發現,鳥瞰圖實現不了我想要的功能,因為我只需要感興趣部分就可以了。後來發現,採用透視變換和透視矯正,可以很好的實現這個功能。下面詳細地介紹了這個方法。

perspective-quadrilateral-src-img.jpg                            perspective-quadrilateral-dst-thumb.jpg

具體流程為:

a)載入影象→灰度化→邊緣處理得到邊緣影象(edge map)

cv::Mat im = cv::imread(filename);

cv::Mat gray;

cvtColor(im,gray,CV_BGR2GRAY);

Canny(gray,gray,100,150,3);

b)霍夫變換進行直線檢測,此處使用的是probabilistic Hough transform(cv::HoughLinesP)而不是standard Hough transform(cv::HoughLines)

std::vector<Vec4i> lines;

cv::HoughLinesP(gray,lines,1,CV_PI/180,70,30,10);

for(int i = 0; i < lines.size(); i++)

    line(im,cv::Point(lines[i][0],lines[i][1]),cv::Point(lines[i][2],lines[i][3]),Scalar(255,0,0),2,8,0);

c)通過上面的圖我們可以看出,通過霍夫變換檢測到的直線並沒有將整個邊緣包含,但是我們要求的是四個頂點所以並不一定要直線真正的相交,下面就要求四個頂點的座標,公式為:

perspective-quadrilateral-line-intersections-equation.png

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cv::Point2f computeIntersect(cv::Vec4i a, cv::Vec4i b) { int x1 = a[0], y1 = a[1], x2 = a[2], y2 = a[3]; int x3 = b[0], y3 = b[1], x4 = b[2], y4 = b[3]; if (float d = ((float)(x1-x2) * (y3-y4)) - ((y1-y2) * (x3-x4))) { cv::Point2f pt; pt.x = ((x1*y2 - y1*x2) * (x3-x4) - (x1-x2) * (x3*y4 - y3*x4)) / d; pt.y = ((x1*y2 - y1*x2) * (y3-y4) - (y1-y2) * (x3*y4 - y3*x4)) / d; return pt; } else return cv::Point2f(-1, -1); }
1 2 3 4 5 6 7 8 9 10 std::vector<cv::Point2f> corners; for (int i = 0; i < lines.size(); i++) { for (int j = i+1; j < lines.size(); j++) { cv::Point2f pt = computeIntersect(lines[i], lines[j]); if (pt.x >= 0 && pt.y >= 0) corners.push_back(pt); } }
d)檢查是不是四邊形

相關推薦

opencv系列之一 利用透視變換實現影象俯檢視正檢視

課題需要,前段時間一直在研究鳥瞰圖,因為當攝像機和目標物有一個傾斜角的時候,採集到的影象會有一個透視畸變,而我們做影象處理,需要得到的是感興趣部分的正檢視,如下面兩幅圖所示。而我發現,鳥瞰圖實現不了我想要的功能,因為我只需要感興趣部分就可以了。後來發現,採用透視變換和

QT 下用opencv實現影象分類1

一.概述 1.按影象中的內容給影象分類是計算機視覺中比較適合初學者的專案,我見過好多手機相簿都有這一個功能,比如把美食歸為一個標籤,藍天白雲歸為一個標籤等等。還有我之前做過的車牌識別的專案都用到影象分類。 2.我做這個專案的環境是QT加opencv3.2,專案在MAC上跑

使用OpenCL+OpenCV實現影象旋轉

[題外話]近期申請了一個微信公眾號:平凡程式人生。有興趣的朋友可以關注,那裡將會涉及更多更新OpenCL+OpenCV以及影象處理方面的文章。 最近在學習《OPENCL異構計算》,其中有一個例項是使用OpenCL實現影象旋轉。這個例項中並沒有涉及讀取、儲存、顯示影象等操作

利用Spring Cloud實現微服務- 熔斷機制

1. 熔斷機制介紹 在介紹熔斷機制之前,我們需要了解微服務的雪崩效應。在微服務架構中,微服務是完成一個單一的業務功能,這樣做的好處是可以做到解耦,每個微服務可以獨立演進。但是,一個應用可能會有多個微服務組成,微服務之間的資料互動通過遠端過程呼叫完成。這就帶來一個問題,假設微服務A呼叫微服務

SSM整合系列之 基於Shiro框架實現自動登入RememberMe

一、前言:Shiro框架提供了記住我(RememerMe)的功能,比如我們訪問一些網站,關閉了瀏覽器,下次再開啟還是能記住你是誰,下次訪問的時候無需登入即可訪問,本文將實現記住我的功能。 專案git地址:https://github.com/gitcaiqing/SSM_DEMO.git

從0到1:神經網路實現影象識別

”. . .  we may have knowledge of the past and cannot control it; we may control the future but have no knowledge of it.” — Claude Shannon 1959

從0到1:神經網路實現影象識別

紙上得來終覺淺,絕知此事要躬行。 “神經網路”是“機器學習”的利器之一,常用演算法在TensorFlow、MXNet計算框架上,有很好的支援。 為了更好的理解與使用這件利器,我們可以不借助計算框架,從零開始,一步步構建模型,實現學習演算法,並在一個影象識別資料集上,訓練這個模型,再驗證模型預

OpenCV入門教程之十】 形態學影象處理:膨脹與腐蝕

本系列文章由@淺墨_毛星雲 出品,轉載請註明出處。 寫作當前博文時配套使用的OpenCV版本: 2.4.8本篇文章中,我們一起探究了影象處理中,最基本的形態學運算——膨脹與腐蝕。淺墨在文章開頭友情提醒,用人物照片做腐蝕和膨脹的素材圖片得到的效果會比較驚悚,毀三觀的,不建議嘗試

區域增長演算法實現影象分割網路

下面程式碼採用堆疊的方式實現了給定種子點的區域生長,該方法步驟如下:   (1)為輸出影象申請緩衝區,並初始化白色;   (2)將種子點入棧,並將輸出影象對應位置編輯黑色;   (3)從棧中彈出一個畫素點(該畫素點已在輸出緩衝區標記過),考察該畫素點的8鄰域中有畫素與種子點灰度差小於給定的閥值T,且該點在輸出

OpenCV利用傅立葉變換和逆變換實現影象卷積演算法,並附自己對於卷積核/模板核算子的理解!

學過訊號與系統的人都知道,卷積運算一般是轉化成頻率乘積再求逆來計算,因為這樣可以減少計算量,提高程式碼的效率。 影象卷積操作廣泛應用在影象濾波技術中。 影象卷積運算中一個重要概念是卷積核算子,它是模板核算子的一種,模板核算子實際上就是一個視窗矩陣,用這個視窗按畫素點滑動去

OpenCV透視變換-將影象由不規則四邊形轉換成矩形

本文是在點選開啟連結基礎上修改而成的,感謝原文博主提供的參考。 程式碼宣告:近期在做身份證影象處理,由於採集問題,採集到的影象存在一定的角度偏差,成為了不規則的四邊形,通過透視變換可將其轉換成矩形,可以更好的進行分割。本文只提供相關函式和相關類。由於博主也是OpenCV新手

Opencv透視變換——實現不規則四邊形轉換為規則矩形以答題卡校正為例

最近在做答題卡識別方面的工作,但是掃描的答題卡試卷可能會存在一定程度的傾斜,而我們需要提取答題卡有效區域並對其進行校正,實現後續的工作。 傾斜答題卡如下圖所示: 我們需要對其進行校正:思路如下 霍夫圓檢測 提取圓心所形成的外包矩形 利用四個圓心與矩形

利用遞歸實現深拷貝常見面試題之一

利用 實現思路 參數 面試題 由於 遞歸實現 但是 log 對象 淺拷貝和深拷貝的區別: 淺拷貝 : 只是將數據中所有的數據引用下來,依舊指向同一個存放地址,拷貝之後的數據修改之後,也會影響到原數據的中的對象數據 深拷貝: 將數據中所有的數據拷貝下來,對拷貝之後的數據進行修

opencv學習筆記python實現 影象金字塔高斯金字塔與拉普拉斯金字塔

使用拉普拉斯金字塔時,影象必須是2^n*2*m 使用拉普拉斯金字塔先要知道高斯金字塔 這兩種過程是圖片縮小與放大 縮小   reduce =  高斯模糊 + 降取樣(pyrDown) 放大    expand = 擴大(升取樣/pyrUp) + 卷積 #-*-c

OpenCV數字影象處理——直方圖均衡化的實現

計算一幅影象的直方圖 影象是由不同數值的顏色畫素組成,畫素值在整幅影象中的分佈情況是該影象的一個重要屬性。直方圖(Histogram)是一幅影象分佈的精確圖形表示。因此,灰度影象的直方圖有256個專案。 OpenCV計算直方圖 環境:Windows 10,

利用遞迴實現深拷貝常見面試題之一

淺拷貝和深拷貝的區別: 淺拷貝 : 只是將資料中所有的資料引用下來,依舊指向同一個存放地址,拷貝之後的資料修改之後,也會影響到原資料的中的物件資料 深拷貝: 將資料中所有的資料拷貝下來,對拷貝之後的資料進行修改不會影響到原資料 實現思路: 將要拷貝的資料

python+OpenCV影象處理霍夫變換簡單圖形檢測

霍夫變換 霍夫變換(Hough Transform)是影象處理中從影象中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進演算法。主要用來從影象中分離出具有某種相同特徵的幾何形狀(如:直線、圓等)。最基本的霍夫變換是從黑白影象中檢測直線。 霍夫變換是經典的檢測直線的演算

IOS下,利用捏合手勢實現影象縮放和顯示

影象的縮放檢視,在移動終端上早已不是問題,任何一個人都能夠熟練的操作影象的縮放。本文所講述的重點並不是應用層面上的,而是從編碼的角度去自己實現一個影象的縮放應用。作者(就是我自己)最近在做一款APP,其中有一個功能就是抓取PC桌面的影象傳送到手機上顯示。雖說現在的手機螢幕

OpenCV學習第三篇:圖片的掩膜操作實現影象的對比度調整

掩膜操作實現影象的對比度調整 矩陣的掩膜操作十分簡單,根據掩膜來重新計算每個畫素的畫素值,掩膜(mask也被稱為kernel) I(i,j) = 5* I(i,j)-[I(i-1,j)+I(i+1,

OpenCV高斯差分技術實現影象邊緣檢測

效果圖 原始碼 邊緣是影象中畫素亮度變化明顯的點。 高斯差分演算法步驟 將影象轉為灰度影象 // 原圖置灰 Imgproc.cvtColor(src, grayM