国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

opencv利用霍夫變換檢測直線進行圖片校正

2020-05-23 13:21:55
字體:
來源:轉載
供稿:網友

利用霍夫變換檢測直線,校正拍攝傾斜的圖片

#include<opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;#define ERROR 1234//度數轉換double DegreeTrans(double theta){ double res = theta / CV_PI * 180; return res;}//逆時針旋轉圖像degree角度(原尺寸) void rotateImage(Mat src, Mat& img_rotate, double degree){ //旋轉中心為圖像中心  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); //計算二維旋轉的仿射變換矩陣  Mat M = getRotationMatrix2D(center, degree, 1); warpAffine(src, img_rotate, M, Size(length, length), 1, 0, Scalar(255, 255, 255));//仿射變換,背景色填充為白色 }//通過霍夫變換計算角度double CalcDegree(const Mat &srcImage, Mat &dst){ Mat midImage, dstImage; Canny(srcImage, midImage, 50, 200, 3); cvtColor(midImage, dstImage, CV_GRAY2BGR); //通過霍夫變換檢測直線 vector<Vec2f> lines; HoughLines(midImage, lines, 1, CV_PI / 180, 300, 0, 0);//第5個參數就是閾值,閾值越大,檢測精度越高 //cout << lines.size() << endl; //由于圖像不同,閾值不好設定,因為閾值設定過高導致無法檢測直線,閾值過低直線太多,速度很慢 //所以根據閾值由大到小設置了三個閾值,如果經過大量試驗后,可以固定一個適合的閾值。 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 << "沒有檢測到直線!" << 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));  //只選角度最小的作為旋轉角度  sum += theta;  line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA); //Scalar函數用于調節線段顏色  imshow("直線探測效果圖", dstImage); } float average = sum / lines.size(); //對所有角度求平均,這樣做旋轉效果會更好 cout << "average theta:" << average << endl; double angle = DegreeTrans(average) - 90; rotateImage(dstImage, dst, angle); //imshow("直線探測效果圖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("旋轉調整后", dst); Mat resulyImage = dst(Rect(0, 0, srcWidth, srcHight)); //根據先驗知識,估計好文本的長寬,再裁剪下來 imshow("裁剪之后", resulyImage); imwrite("recified.jpg", resulyImage);}int main(){ ImageRecify("jiao.jpg", "FinalImage.jpg"); waitKey(); return 0;}

效果圖如下所示:

opencv,霍夫變換,檢測直線,圖片校正

opencv,霍夫變換,檢測直線,圖片校正

opencv,霍夫變換,檢測直線,圖片校正

opencv,霍夫變換,檢測直線,圖片校正

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨州市| 南部县| 阿拉善盟| 府谷县| 陈巴尔虎旗| 离岛区| 克东县| 龙口市| 舒城县| 荃湾区| 江永县| 汉沽区| 漳州市| 抚顺县| 兰坪| 临澧县| 大庆市| 清水县| 唐山市| 阿坝| 淄博市| 沙雅县| 昌黎县| 交城县| 上饶县| 易门县| 山丹县| 太湖县| 招远市| 兴化市| 突泉县| 重庆市| 鄱阳县| 黑龙江省| 基隆市| 溧阳市| 宁阳县| 思南县| 金堂县| 锦屏县| 贺州市|