#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat src; //源图像 Mat tmp; //临时图像 Mat dst_bw; //去掉背景后的目标二值图像 Mat dst_contours;//轮廓图像 src=imread("E:\\单板图片\\求孔洞数和孔洞面积\\aa.jpg");//未标题-1.jpg1-1.jpg 131.png namedWindow("原图"); imshow("原图",src); cvtColor(src,dst_bw,CV_RGB2GRAY); threshold( dst_bw, dst_bw ,180, 255, CV_THRESH_BINARY); namedWindow("dst_bw"); imshow("dst_bw",dst_bw); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(dst_bw,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); drawContours(src,contours,-1,Scalar(0,255,0),8); for (int i=0;i<contours.size();i++) { vector<Point> points; RotatedRect box=minAreaRect(Mat(contours[i])); Point2f vertex[4]; box.points(vertex); for (int j=0;j<4;j++) { line(src,vertex[j],vertex[(j+1)%4],Scalar(0,0,255),2,CV_AA); } Mat imgROI=src(Rect(vertex[1],vertex[3])); char image_name[30]; sprintf(image_name, "%s_%d_%s", "roi",i, ".jpg"); imwrite(image_name,imgROI); } imshow("效果图",src); waitKey(0); return 0; }