opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正
利用霍夫變換檢測(cè)直線,校正拍攝傾斜的圖片
#include<opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std; #define ERROR 1234 //度數(shù)轉(zhuǎn)換 double DegreeTrans(double theta) { double res = theta / CV_PI * 180; return res; } //逆時(shí)針旋轉(zhuǎn)圖像degree角度(原尺寸) void rotateImage(Mat src, Mat& img_rotate, double degree) { //旋轉(zhuǎn)中心為圖像中心 Point2f center; center.x = float(src.cols / 2.0); center.y = float(src.rows / 2.0); int length = 0; length = sqrt(src.cols*src.cols + src.rows*src.rows); //計(jì)算二維旋轉(zhuǎn)的仿射變換矩陣 Mat M = getRotationMatrix2D(center, degree, 1); warpAffine(src, img_rotate, M, Size(length, length), 1, 0, Scalar(255, 255, 255));//仿射變換,背景色填充為白色 } //通過霍夫變換計(jì)算角度 double CalcDegree(const Mat &srcImage, Mat &dst) { Mat midImage, dstImage; Canny(srcImage, midImage, 50, 200, 3); cvtColor(midImage, dstImage, CV_GRAY2BGR); //通過霍夫變換檢測(cè)直線 vector<Vec2f> lines; HoughLines(midImage, lines, 1, CV_PI / 180, 300, 0, 0);//第5個(gè)參數(shù)就是閾值,閾值越大,檢測(cè)精度越高 //cout << lines.size() << endl; //由于圖像不同,閾值不好設(shè)定,因?yàn)殚撝翟O(shè)定過高導(dǎo)致無法檢測(cè)直線,閾值過低直線太多,速度很慢 //所以根據(jù)閾值由大到小設(shè)置了三個(gè)閾值,如果經(jīng)過大量試驗(yàn)后,可以固定一個(gè)適合的閾值。 if (!lines.size()) { HoughLines(midImage, lines, 1, CV_PI / 180, 200, 0, 0); } //cout << lines.size() << endl; if (!lines.size()) { HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0); } //cout << lines.size() << endl; if (!lines.size()) { cout << "沒有檢測(cè)到直線!" << endl; return ERROR; } float sum = 0; //依次畫出每條線段 for (size_t i = 0; i < lines.size(); i++) { float rho = lines[i][0]; float theta = lines[i][1]; Point pt1, pt2; //cout << theta << endl; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000 * (-b)); pt1.y = cvRound(y0 + 1000 * (a)); pt2.x = cvRound(x0 - 1000 * (-b)); pt2.y = cvRound(y0 - 1000 * (a)); //只選角度最小的作為旋轉(zhuǎn)角度 sum += theta; line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA); //Scalar函數(shù)用于調(diào)節(jié)線段顏色 imshow("直線探測(cè)效果圖", dstImage); } float average = sum / lines.size(); //對(duì)所有角度求平均,這樣做旋轉(zhuǎn)效果會(huì)更好 cout << "average theta:" << average << endl; double angle = DegreeTrans(average) - 90; rotateImage(dstImage, dst, angle); //imshow("直線探測(cè)效果圖2", dstImage); return angle; } void ImageRecify(const char* pInFileName, const char* pOutFileName) { double degree; Mat src = imread(pInFileName); imshow("原始圖", src); int srcWidth, srcHight; srcWidth = src.cols; srcHight = src.rows; cout << srcWidth << " " << srcHight << endl; Mat dst; src.copyTo(dst); //傾斜角度矯正 degree = CalcDegree(src, dst); if (degree == ERROR) { cout << "矯正失??!" << endl; return; } rotateImage(src, dst, degree); cout << "angle:" << degree << endl; imshow("旋轉(zhuǎn)調(diào)整后", dst); Mat resulyImage = dst(Rect(0, 0, srcWidth, srcHight)); //根據(jù)先驗(yàn)知識(shí),估計(jì)好文本的長(zhǎng)寬,再裁剪下來 imshow("裁剪之后", resulyImage); imwrite("recified.jpg", resulyImage); } int main() { ImageRecify("jiao.jpg", "FinalImage.jpg"); waitKey(); return 0; }
效果圖如下所示:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:運(yùn)用指針在不用加號(hào)的情況進(jìn)行加法運(yùn)算的講解
欄 目:C語(yǔ)言
下一篇:OpenCV繪制正多邊形的方法
本文標(biāo)題:opencv利用霍夫變換檢測(cè)直線進(jìn)行圖片校正
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/543.html
您可能感興趣的文章
- 01-10利用C語(yǔ)言實(shí)踐OOP,以及new,delete的深入分析
- 01-10利用ace的ACE_Task等類實(shí)現(xiàn)線程池的方法詳解
- 01-10解析如何利用switch語(yǔ)句進(jìn)行字符統(tǒng)計(jì)
- 01-10利用C語(yǔ)言實(shí)現(xiàn)HashTable
- 01-10利用C++實(shí)現(xiàn)從std::string類型到bool型的轉(zhuǎn)換
- 01-10利用C++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序
- 01-10利用C++實(shí)現(xiàn)矩陣的相加/相稱/轉(zhuǎn)置/求鞍點(diǎn)
- 01-10c++回調(diào)之利用sink示例
- 01-10c++回調(diào)之利用函數(shù)指針示例
- 01-10利用c語(yǔ)言實(shí)現(xiàn)卷積碼編碼器示例


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文