OpenCv-C++-小案例實戰-切邊(一)
阿新 • • 發佈:2018-12-23
假如說現在有這麼一張圖片如下:
現在我想要去掉這張圖外面的白色區域,只留下紅色線框以內的部分。最終效果如圖所示:
那麼對於這樣一張圖片,解決思路如下:
1、邊緣檢測
2、輪廓發現
3、求最小外接矩形
4、ROI擷取
放上程式碼:
#include<opencv2/opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; Mat src, dst, gray_src; int current_level = 50; int max_level = 255; void cut_image(int, void*); const char* output_title = "rectminArea"; int main(int argc, char**argv) { src = imread("D:/test/切邊測試圖.png", 1); if (src.empty()) { cout << "圖片未找到" << endl; return -1; } namedWindow(output_title,CV_WINDOW_AUTOSIZE); createTrackbar("Value", output_title, ¤t_level, max_level, cut_image); cut_image(0,0); imshow("input image", src); waitKey(0); return 0; } void cut_image(int, void*) { Mat canyImg; cvtColor(src, gray_src, CV_BGR2GRAY); Canny(gray_src, canyImg, current_level, 2 * current_level, 3,false); vector<vector<Point>> contours; vector<Vec4i>hierachy; Mat showImg = Mat::zeros(src.size(), CV_8UC3); findContours(canyImg, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); RNG rng(12345); int minw = src.cols*0.75; int minh = src.rows*0.75; Rect box; //獲取roi區域 Mat contoursimg= Mat::zeros(src.size(), CV_8UC3); for (size_t t = 0; t < contours.size(); t++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(contoursimg, contours, int(t), color, 1, 8, hierachy, 0, Point(0, 0)); RotatedRect minrect = minAreaRect(contours[t]); //獲取輪廓的最小外接矩形 float angle = abs(minrect.angle); if (minrect.size.height > minh && minrect.size.width > minw && minrect.size.width < (src.cols - 5)) { Point2f pts[4]; minrect.points(pts); //獲取最小外接矩形的四個頂點座標 for(int i=0;i<4;i++) { line(showImg,pts[i], pts[(i + 1) % 4], color, 2, 8, 0); cout << "X座標:" << minrect.center.x <<" "<< "Y座標:" << minrect.center.y << " "<<"偏移角度:" << angle << endl; } box = minrect.boundingRect(); } if (box.width > 0 && box.height > 0) { Mat roiImg=src(box);//擷取roi區域 imshow("roiImg", roiImg); } } imshow(output_title, showImg); imshow("contours image", contoursimg); }
所以,最終結果為:
因為該圖片旋轉角度為0,也就是說,它是一個完完全全的正的矩形,如果,它是一個旋轉一定角度後的圖片該怎麼做呢?下一篇文章記錄。