opencv 學習(4)缺陷弧的查詢
阿新 • • 發佈:2018-12-13
我不知道我寫的這個程式是否符合查詢缺陷的要求,但是,作為入門,我還是將它放上來。如有錯誤,還請指出,本人學生,水平有限。
首先,缺陷弧的查詢,主要工作就是把弧提取出來,然後在進行相關操作來描述它是缺陷還是完美。我的結果是這樣的::
void YK_R_R(vector<vector<Point>> &Number, Mat& image, double R_r, int Rec_or_Cir,int flog); int main() { Mat img1 = imread("G:\\yk\\Desktop\\檔案\\aI\\opencv\\opencv圖\\新建資料夾\\2.bmp", 0); Mat img2 = Mat::zeros(img1.rows, img1.cols, CV_8UC1); Mat img3 = Mat::zeros(img1.rows, img1.cols, CV_8UC3); Mat img4 = Mat::zeros(img1.rows, img1.cols, CV_8UC1); Mat img5 = Mat::zeros(img1.rows, img1.cols, CV_8UC1); int v = 0, position = 0; imshow("2", img1); for (int i = 0; i < img1.rows; i++) { for (int j = 0; j < img1.cols ; j++) { // img4.at<uchar>(i, j) = 0; img3.at<Vec3b>(i, j)[0] = img1.at<uchar>(i, j); img3.at<Vec3b>(i, j)[1] = img1.at<uchar>(i, j); img3.at<Vec3b>(i, j)[2] = img1.at<uchar>(i, j); } } for (int i = img1.rows / 2 - 200; i < img1.rows / 2 + 200; i++) { for (int j = img1.cols / 2 - 200; j < img1.cols / 2 + 200; j++) { if(img1.at<uchar>(i, j)>38)img2.at<uchar>(i, j) = img1.at<uchar>(i, j); } } blur(img2, img2, Size(3, 3)); vector<vector<Point>>conts; vector<Vec4i>hicouts; Canny(img2, img2, 30, 70); findContours(img2, conts, hicouts, CV_RETR_TREE, CV_CHAIN_APPROX_NONE); double sum_X = 0.0, sum_Y = 0.0; double X = 0.0, Y = 0.0; for (int i = 0; i < conts.size(); i++) { for (int j = 0; j < conts[i].size(); j++) { sum_X += conts[i][j].x; sum_Y += conts[i][j].y; if (j + 1 >= conts[i].size()) { X += sum_X / conts[i].size(); Y += sum_Y / conts[i].size(); sum_X = 0; sum_Y = 0; } } } X = X / conts.size(); Y = Y / conts.size(); int temp = X, temp1 = Y, temp2 = X, temp3 = Y; for (int i = 0; i < conts.size(); i++) { for (int j = 0; j < conts[i].size(); j++) { if (conts[i][j].x < temp) { temp = conts[i][j].x; } if (conts[i][j].y < temp1) { temp1 = conts[i][j].y; } if (conts[i][j].x > temp2) { temp2 = conts[i][j].x; } if (conts[i][j].y > temp3) { temp3 = conts[i][j].y; } } } Point heart((temp + temp2) / 2, (temp1 + temp3) / 2); YKcircle(img4, heart, 130, 2); YKcircle(img4, heart, 90, 3); //Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); for (int i = 0; i < img1.rows; i++) { for (int j = 0; j < img1.cols; j++) { if (img4.at<uchar>(i, j) == 255) { if(img1.at<uchar>(i, j)>30) img5.at<uchar>(i, j) = img1.at<uchar>(i, j); } } } blur(img5, img5, Size(3, 3)); medianBlur(img5, img5, 9); Canny(img5, img5, 80, 90); vector<vector<Point>>contsq; vector<Vec4i>hicoutsq; findContours(img5, contsq, hicoutsq, CV_RETR_TREE, CV_CHAIN_APPROX_NONE); double maX = 0.0, max_i = 0.0, max_i1 = 0.0; int z = 0; Mat image= Mat::zeros(img1.rows, img1.cols, CV_8UC3); Mat image1 = Mat::zeros(img1.rows, img1.cols, CV_8UC3); Mat image2 = Mat::zeros(img1.rows, img1.cols, CV_8UC1); for (int i = 0; i < contsq.size(); i++) { double length = arcLength(contsq[i], true); double area = contourArea(contsq[i], arcLength(contsq[i], true)); if (contsq[i].size() > maX) { maX = contsq[i].size(); max_i = i; } if (i + 1 >= contsq.size()) { drawContours(image, contsq, max_i, Scalar(0, 0, 255), 2, 8, hicoutsq); } } cvtColor(image, image, COLOR_BGR2GRAY); Mat element1 = getStructuringElement(MORPH_RECT, Size(3, 3)); erode(image, image, element1); vector<vector<Point>>contsq1; vector<Vec4i>hicoutsq1; findContours(image, contsq1, hicoutsq1, CV_RETR_TREE, CV_CHAIN_APPROX_NONE); for(int i=0;i<contsq1.size();i++) { drawContours(image1, contsq1, i, Scalar(255, 255, 255), -1, 8, hicoutsq1); } cvtColor(image1, image1, COLOR_BGR2GRAY); Canny(image1, image1, 30, 70); contsq1.clear(); hicoutsq1.clear(); //imshow("f", image1); findContours(image1, contsq1, hicoutsq1, CV_RETR_TREE, CV_CHAIN_APPROX_NONE); vector<vector<Point>>hull(contsq1.size()); vector<Moments>MM(contsq1.size()); for (int i = 0; i< contsq1.size(); i++) { convexHull(Mat(contsq1[i]), hull[i], true); MM[i] = moments(contsq1[i], false); } vector<Point2f>mc(contsq1.size()); for (int i = 0; i < contsq1.size(); i++) { mc[i] = Point2f(MM[i].m10 / MM[i].m00, MM[i].m01 / MM[i].m00); } Point heart1(mc[0].x, mc[0].y); vector<vector<Point>>Number; vector<Point>number; number.clear(); for (int i = 0; i < contsq1.size(); i++) { for (int j = 0; j < contsq1[i].size()/2; j++) { if ((contsq1[i][j].x - heart1.x)*(contsq1[i][j].x - heart1.x) + (contsq1[i][j].y - heart1.y)*(contsq1[i][j].y - heart1.y) < ridu*ridu) { v = 0; number.push_back(contsq1[i][j]); } else { if (v == 0) { Number.push_back(number); number.clear(); position++; v++; } } } } YK_R_R(Number,img3,0.8400,0,1); //imwrite("G:\\yk\\Desktop\\3result.bmp", image2); imshow("1", img3); waitKey(0); return 0; }