霍夫線檢測
vector<Vec2f> lines1;HoughLines(canny_mat, lines1, 1, CV_PI / 180.0,90 );//45可以檢測里面兩條線 80檢測出外邊兩條線
?定義存放輸出線的向量 此向量輸出有<距離,角度>
因為檢測的原理就是在變換霍夫空間里面去檢測的,這里可以理解為極坐標
第3個參數是距離精度 第四個參數是角度精度,第五個是閾值,只有點超過90個才算一條線
在圖中畫線操作:
Point ptz1, ptz2;for (size_t i = 0; i < lines1.size(); ++i) {float rth = lines1[i][0];//距離float theta = lines1[i][1];//角度double a = cos(theta);double b = sin(theta);double x0 = a * rth, y0 = b * rth;ptz1.x = cvRound(x0 + 1000 * (-b));ptz1.y = cvRound(y0 + 1000 * (a));ptz2.x = cvRound(x0 - 1000 * (-b));ptz2.y = cvRound(y0 - 1000 * (a));line(image1, ptz1, ptz2, Scalar(0, 255, 0), 2, 8);}
這里是畫線操作?
概率霍夫線檢測
vector<Vec4i>lines2;HoughLinesP(canny_mat, lines2, 1, CV_PI / 180.0, 25,25,32);//參數如何設置啊? 點數多少 最小長度 最大容忍間隔
后面三個參數依次是
// 大于閾值threshold的線段才可以被檢測通過并返回到結果中。
// 表示最低線段的長度,比這個設定參數短的線段就不能被顯現出來
// 允許將同一行點與點之間連接起來的最大的距離?
這里的畫線操作就簡單一點 直接畫
Point ptz3, ptz4;for (int j = 0; j < lines2.size(); j++) {ptz3.x = lines2[j][0];ptz3.y = lines2[j][1];ptz4.x = lines2[j][2];ptz4.y = lines2[j][3];line(image2, ptz3, ptz4, Scalar(0, 255, 255), 2, 8);}
?
輪廓的尋找
Mat binary;threshold(gray, binary, 84, 255, THRESH_OTSU);imshow("binary", binary);waitKey(0);cvDestroyAllWindows();vector<vector<Point>> contours;findContours(binary, contours, RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);Mat image3clone = image3.clone();for (int i = 0; i < contours.size(); i++) {drawContours(image3clone, contours, i, Scalar(0, 255, 255), 2, 8);}
先是二值化圖像,再用findcontours函數尋找輪廓,后面兩個參數是尋找最外輪廓,內接輪廓就不管,用的是簡單保存的方式。
畫出輪廓用的是drawcontours來畫輪廓,直接在圖像上畫出輪廓即可
畫出輪廓外最小外接矩形
Point2f vtx[4];RotatedRect rbox = minAreaRect(contours[0]);rbox.points(vtx);for (int i = 0; i < 4; i++) {line(image3, vtx[i], vtx[i < 3 ? i + 1 : 0], CV_RGB(0, 255, 0), 2, CV_AA);}
定義4個點存儲外接矩形定點,minAreaRect是外接矩形的rect,rbox.points是賦值給vtx,然后用一個簡單的畫線操作,依次畫點和點的連線
改進版的圖像旋轉
前面的獲得矩陣操作一樣
float angel = -10.0, scale = 1;Point2f center(lena.cols * 0.5, lena.rows * 0.5);Mat rot = getRotationMatrix2D(center, angel, scale);
獲得外接矩形的作為最后的大小
Rect bbox = RotatedRect(center, lena.size(), angel).boundingRect();//獲取外接矩形
然后得調整rot矩陣得參數,因為中心點有所偏移,需要平移操作
rot.at<double>(0, 2) += bbox.width / 2.0 - center.x;//調整仿射變換矩陣參數【a,b,l/n b,c,m】此步在調節l,m值
rot.at<double>(1, 2) += bbox.height / 2.0 - center.y;//
Mat dst;
warpAffine(lena, dst, rot, bbox.size());
即可完成沒有缺損得旋轉圖像!