1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| void getCoarseEdge(Mat &src, Mat &dst) { if (!src.data) { cout << QString("输入图像为空").toLocal8Bit().toStdString() << endl; return; }
Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY);
gray.convertTo(gray, CV_32FC1);
Mat leftTopSobelKernel = (Mat_<float>(3, 3) << 2, 1, 0, 1, 0, -1, 0, -1, -2); Mat topSobelKernel = (Mat_<float>(3, 3) << 1, 2, 1, 0, 0, 0, -1, -2, -1); Mat rightTopSobelKernel = (Mat_<float>(3, 3) << 0, 1, 2, -1, 0, 1, -2, -1, 0); Mat rightSobelKernel = (Mat_<float>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1); Mat rightBottomSobelKernel = -leftTopSobelKernel; Mat bottomSobelKernel = -topSobelKernel; Mat leftBottomSobelKernel = -rightTopSobelKernel; Mat leftSobelKernel = -rightSobelKernel; Mat g1, g2, g3, g4, g5, g6, g7, g8; filter2D(gray, g1, CV_32F, leftTopSobelKernel); filter2D(gray, g2, CV_32F, topSobelKernel); filter2D(gray, g3, CV_32F, rightTopSobelKernel); filter2D(gray, g4, CV_32F, rightSobelKernel); filter2D(gray, g5, CV_32F, rightBottomSobelKernel); filter2D(gray, g6, CV_32F, bottomSobelKernel); filter2D(gray, g7, CV_32F, leftBottomSobelKernel); filter2D(gray, g8, CV_32F, leftSobelKernel);
gray.release();
Mat result = ((abs(g1) + abs(g2) + abs(g3) + abs(g4) + abs(g5) + abs(g6) + abs(g7) + abs(g8)) / 8); g1.release(); g2.release(); g3.release(); g4.release(); g5.release(); g6.release(); g7.release(); g8.release();
double maxLight; minMaxIdx(result, NULL, &maxLight); result.convertTo(dst, CV_8UC1, 255.0 / maxLight); }
|