医疗网站如何做优化,一级域名免费申请,西安免费做网站多少钱,建筑工程网络计划方法计算机视觉之家看到快速圆检测Edge Drawing#xff0c;其效果比霍夫要好#xff0c;速度更快#xff08;具体效果可以参考视觉之家的文章#xff09;#xff0c;上面C代码不全#xff0c;那么好的检测效果国内资料竟然那么少#xff0c;后在opencv的开发文档中找到了C代…计算机视觉之家看到快速圆检测Edge Drawing其效果比霍夫要好速度更快具体效果可以参考视觉之家的文章上面C代码不全那么好的检测效果国内资料竟然那么少后在opencv的开发文档中找到了C代码在此分享学习交流。
实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示详细步骤 代码_opencv 找圆_计算机视觉之家的博客-CSDN博客
OpenCV: EdgeDrawing
OpenCV: fld_lines.cpp
#include iostream#include opencv2/imgproc.hpp
#include opencv2/ximgproc.hpp
#include opencv2/imgcodecs.hpp
#include opencv2/highgui.hppusing namespace std;
using namespace cv;
using namespace cv::ximgproc;int main(int argc, char** argv)
{string in;CommandLineParser parser(argc, argv, {input|corridor.jpg|input image}{help h||show help message});if (parser.has(help)){parser.printMessage();return 0;}in samples::findFile(parser.getstring(input));Mat image imread(in, IMREAD_GRAYSCALE);if( image.empty() ){return -1;}// Create FLD detector// Param Default value Description// length_threshold 10 - Segments shorter than this will be discarded// distance_threshold 1.41421356 - A point placed from a hypothesis line// segment farther than this will be// regarded as an outlier// canny_th1 50 - First threshold for// hysteresis procedure in Canny()// canny_th2 50 - Second threshold for// hysteresis procedure in Canny()// canny_aperture_size 3 - Aperturesize for the sobel operator in Canny().// If zero, Canny() is not applied and the input// image is taken as an edge image.// do_merge false - If true, incremental merging of segments// will be performedint length_threshold 10;float distance_threshold 1.41421356f;double canny_th1 50.0;double canny_th2 50.0;int canny_aperture_size 3;bool do_merge false;PtrFastLineDetector fld createFastLineDetector(length_threshold,distance_threshold, canny_th1, canny_th2, canny_aperture_size,do_merge);vectorVec4f lines;// Because of some CPUs power strategy, it seems that the first running of// an algorithm takes much longer. So here we run the algorithm 10 times// to see the algorithms processing time with sufficiently warmed-up// CPU performance.for (int run_count 0; run_count 5; run_count) {double freq getTickFrequency();lines.clear();int64 start getTickCount();// Detect the lines with FLDfld-detect(image, lines);double duration_ms double(getTickCount() - start) * 1000 / freq;cout Elapsed time for FLD duration_ms ms. endl;}// Show found lines with FLDMat line_image_fld(image);fld-drawSegments(line_image_fld, lines);imshow(FLD result, line_image_fld);waitKey(1);PtrEdgeDrawing ed createEdgeDrawing();ed-params.EdgeDetectionOperator EdgeDrawing::SOBEL;ed-params.GradientThresholdValue 38;ed-params.AnchorThresholdValue 8;vectorVec6d ellipses;for (int run_count 0; run_count 5; run_count) {double freq getTickFrequency();lines.clear();int64 start getTickCount();// Detect edges//you should call this before detectLines() and detectEllipses()ed-detectEdges(image);// Detect linesed-detectLines(lines);double duration_ms double(getTickCount() - start) * 1000 / freq;cout Elapsed time for EdgeDrawing detectLines duration_ms ms. endl;start getTickCount();// Detect circles and ellipsesed-detectEllipses(ellipses);duration_ms double(getTickCount() - start) * 1000 / freq;cout Elapsed time for EdgeDrawing detectEllipses duration_ms ms. endl;}Mat edge_image_ed Mat::zeros(image.size(), CV_8UC3);vectorvectorPoint segments ed-getSegments();for (size_t i 0; i segments.size(); i){const Point* pts segments[i][0];int n (int)segments[i].size();polylines(edge_image_ed, pts, n, 1, false, Scalar((rand() 255), (rand() 255), (rand() 255)), 1);}imshow(EdgeDrawing detected edges, edge_image_ed);Mat line_image_ed(image);fld-drawSegments(line_image_ed, lines);// Draw circles and ellipsesfor (size_t i 0; i ellipses.size(); i){Point center((int)ellipses[i][0], (int)ellipses[i][1]);Size axes((int)ellipses[i][2] (int)ellipses[i][3], (int)ellipses[i][2] (int)ellipses[i][4]);double angle(ellipses[i][5]);Scalar color ellipses[i][2] 0 ? Scalar(255, 255, 0) : Scalar(0, 255, 0);ellipse(line_image_ed, center, axes, angle, 0, 360, color, 2, LINE_AA);}imshow(EdgeDrawing result, line_image_ed);waitKey();return 0;
}