在曲线拟合过程中,首先需要对曲线进行采样,以去掉过多拟合的点。
简单介绍曲线等距离采样的方法。
程序如下:
#includeopencv2/opencv.hpp#includeiostreamintmain(){cv::Matim=cv::imread("1.png",1);cv::Matgray_im;cv::cvtColor(im,gray_im,cv::COLOR_BGR2GRAY);std::vectorcv::Point2fsrc_pts;cv::Matmask_im=cv::Mat::zeros(im.size(),CV_8UC1);for(size_ti=0;igray_im.rows;i++){for(size_tj=0;jgray_im.cols-1;j++){intvalue=gray_im.atunsignedchar(i,j);intvalue1=gray_im.atunsignedchar(i,j+1);if(valuevalue){src_pts.emplace_back(cv::Point2f(j,i));cv::circle(mask_im,cv::Point2f(j,i),1,cv::Scalar(),1);}}}cv::imshow("mask_im",mask_im);cv::waitKey();//测试//src_pts.clear();//src_pts.emplace_back(cv::Point2f(1,0));//src_pts.emplace_back(cv::Point2f(2,0));//src_pts.emplace_back(cv::Point2f(4,0));//src_pts.emplace_back(cv::Point2f(7,0));//src_pts.emplace_back(cv::Point2f(11,0));//src_pts.emplace_back(cv::Point2f(12,0));//按一定距离筛选点std::vectorcv::Point2fdst_pts;intis_selected=false;inti=0;while(isrc_pts.size()-1){intcnt=1;while(cv::norm(src_pts[i+cnt]-src_pts[i])15){cnt++;if((i+cnt)=src_pts.size()){break;}is_selected=true;}if(!is_selected){i++;}else{dst_pts.emplace_back(src_pts[i]);i=i+cnt;}}std::coutdst_ptsstd::endl;cv::Matmask_im1=cv::Mat::zeros(im.size(),CV_8UC1);for(size_ti=0;idst_pts.size();i++){cv::circle(mask_im1,dst_pts[i],1,cv::Scalar(),-1);}cv::imshow("mask_im1",mask_im1);cv::imwrite("dst.png",mask_im1);cv::waitKey();return0;}
CMakeLists.txt如下:
#声明要求的cmake最低版本cmake_minimum_required(VERSION2.8)#声明一个cmake工程project(opencv_test)#设置编译模式set(CMAKE_BUILD_TYPE"Debug")set(CMAKE_CXX_FLAGS"-std=c++11")find_package(OpenCV3REQUIRED)#添加一个可执行程序#语法:add_executable(程序名源代码文件)add_executable(testmain.cpp)#将库文件链接到可执行程序上target_link_libraries(test{OpenCV_LIBS})
结果如下:
《完》
点击上方小卡片