当前位置: 首页 > news >正文

东莞常平有高铁站吗有趣的网络营销案例

东莞常平有高铁站吗,有趣的网络营销案例,网站内链建设不可忽视的地方,sae网站开发采用opencv 对图像中的小球通过canny边缘检测的方式进行提取坐标 本文介绍了如何使用OpenCV对图像中的小球进行Canny边缘检测#xff0c;并通过Zernike矩进行亚像素边缘检测#xff0c;最终拟合椭圆以获取小球的精确坐标。首先#xff0c;图像被转换为灰度图并进行高斯平滑…采用opencv 对图像中的小球通过canny边缘检测的方式进行提取坐标 本文介绍了如何使用OpenCV对图像中的小球进行Canny边缘检测并通过Zernike矩进行亚像素边缘检测最终拟合椭圆以获取小球的精确坐标。首先图像被转换为灰度图并进行高斯平滑处理接着通过Canny算法检测边缘。然后利用Zernike矩对边缘点进行亚像素级别的精确定位最后通过椭圆拟合得到小球的中心坐标。该方法能够有效提高小球检测的精度适用于需要高精度定位的图像处理任务。 #include opencv2/opencv.hpp #include iostream #include vector #include map #include cmath#pragma comment(linker, /subsystem:\console\ /entry:\mainCRTStartup\ ) //#pragma comment(linker, /subsystem:\windows\ /entry:\mainCRTStartup\)// 全局变量存储显示状态 double scale 1.0; // 当前缩放比例 int offset_x 0; // X轴偏移量 int offset_y 0; // Y轴偏移量 cv::Point mouse_pt(-1, -1); // 鼠标位置 bool dragging false; // 拖拽状态struct ZernikeTemplates {cv::Mat real;cv::Mat imag;cv::Mat mod; };ZernikeTemplates generateZernikeTemplates(int N) {ZernikeTemplates zt;int size 2 * N 1;zt.real cv::Mat::zeros(size, size, CV_64F);zt.imag cv::Mat::zeros(size, size, CV_64F);zt.mod cv::Mat::zeros(size, size, CV_64F);for (int y -N; y N; y) {for (int x -N; x N; x) {double rho sqrt(x * x y * y) / N;double theta atan2(y, x);if (rho 1.0) {zt.real.atdouble(y N, x N) rho * cos(theta);zt.imag.atdouble(y N, x N) rho * sin(theta);//zt.mod.atdouble(y N, x N) 1.0;}elsezt.mod.atdouble(y N, x N) 1.0;}}// 归一化double sum_real sum(abs(zt.real))[0];double sum_imag sum(abs(zt.imag))[0];double sum_mod sum(zt.mod)[0];zt.real / sum_real;zt.imag / sum_imag;zt.mod / sum_mod;return zt; }std::vectorcv::Point2d zernikeEdgeDetection(const cv::Mat grayImg, const cv::Mat edges,int zernikeN,double minEdgeStrength) {// 生成Zernike模板ZernikeTemplates zt generateZernikeTemplates(zernikeN);// 收集边缘点std::vectorcv::Point edgePixels;findNonZero(edges, edgePixels);// 亚像素边缘检测std::vectorcv::Point2d subPixelEdges;for (const cv::Point p : edgePixels) {int x p.x;int y p.y;// 检查边界if (x zernikeN || x grayImg.cols - zernikeN ||y zernikeN || y grayImg.rows - zernikeN)continue;// 提取ROIcv::Rect roi(x - zernikeN, y - zernikeN, 2 * zernikeN 1, 2 * zernikeN 1);cv::Mat region grayImg(roi).clone();region.convertTo(region, CV_64F, 1.0 / 255.0);// 计算Zernike矩double M_real sum(region.mul(zt.real))[0];double M_imag sum(region.mul(zt.imag))[0];double M_mod sum(region.mul(zt.mod))[0];// 计算边缘参数double theta atan2(M_imag, M_real);double edgeStrength sqrt(M_real * M_real M_imag * M_imag) / M_mod;// 计算偏移量double l (3 * M_mod - 4 * (M_real * cos(theta) M_imag * sin(theta)))/ (2 * edgeStrength 1e-6);// 有效性检查if (abs(l) zernikeN * 1.5 || edgeStrength minEdgeStrength)continue;// 计算亚像素坐标cv::Point2d subPixel(p.x l * cos(theta)1, p.y l * sin(theta)1); // MARLAB坐标偏移补偿subPixelEdges.push_back(subPixel);}return subPixelEdges; }cv::RotatedRect fitEllipseRobust(const std::vectorcv::Point2d points) {// 将点转换为Point2f格式std::vectorcv::Point2f pointsF;int i 0;for (const auto p : points){i;pointsF.emplace_back(p.x, p.y);std::cout i point: p.x p.y std::endl;}// 使用OpenCV的椭圆拟合带鲁棒性cv::RotatedRect ellipse fitEllipse(pointsF);return ellipse; }int main() {// 1.读取bmp图片及显示结果cv::Mat image cv::imread(G:/tools/matlab2020b/Zernike/left_4.bmp,cv::IMREAD_COLOR);if (image.empty()) {std::cout Could not open or find the image std::endl;return -1;}//cv::imshow(原始图像, image);// 2.进行Canny阈值边缘检测及显示结果// 参数设置double canny_thresh[2] { 0.1, 0.4 }; // Canny阈值int zernike_N 7;double min_edge_strength 0.1;cv::Mat gray_img;// 转换为灰度图if (image.channels() 3) {cv::cvtColor(image, gray_img, cv::COLOR_BGR2GRAY);}else {gray_img image.clone();}// 归一化处理类似于MATLAB的im2doublegray_img.convertTo(gray_img, CV_64F, 1.0 / 255.0);// 转换回CV_8U类型cv::Mat gray_img_8u;gray_img.convertTo(gray_img_8u, CV_8U, 255.0);// 手动对图像进行高斯平滑处理cv::Mat blurred;cv::GaussianBlur(gray_img_8u, blurred, cv::Size(5,5),0.3);// MATLAB默认sigma0.6//cv::GaussianBlur(gray_img_8u, blurred, cv::Size(3, 3), 0);// Otsu 阈值分割cv::Mat binary;cv::threshold(blurred, binary, 0, 255, cv::THRESH_BINARY cv::THRESH_OTSU);// 步骤1: Canny边缘检测cv::Mat BW;double low_thresh canny_thresh[0] * 255;double high_thresh canny_thresh[1] * 255;cv::Canny(binary * 255, BW, low_thresh, high_thresh, 7);cv::imshow(Canny图像, BW);cv::imwrite(G:/tools/matlab2020b/Zernike/Canny.bmp, BW);// 3.Zernike矩亚像素边缘检测及显示结果std::vectorcv::Point2d subPixelEdges zernikeEdgeDetection(binary, BW, zernike_N, min_edge_strength);// 椭圆拟合if (subPixelEdges.size() 5) {std::cerr Not enough points for ellipse fitting std::endl;return -1;}cv::RotatedRect ellipse fitEllipseRobust(subPixelEdges);// 显示结果cv::Mat display image.clone();// 绘制边缘点for (const auto p : subPixelEdges){circle(display, p, 0.1, cv::Scalar(0, 255, 255), cv::FILLED);}// 绘制椭圆//cv::ellipse(display, ellipse, cv::Scalar(0, 0, 255), 1);// 绘制中心circle(display, ellipse.center, 0.1, cv::Scalar(0, 0, 255), cv::FILLED);std::cout -------center------- ellipse.center.x ellipse.center.y std::endl;// 创建窗口并设置回调cv::namedWindow(Zoomable Window, cv::WINDOW_AUTOSIZE);cv::imshow(Zoomable Window, display);// 4.椭圆拟合及显示结果cv::imwrite(G:/tools/matlab2020b/Zernike/edges.bmp, display);//cv::Mat combined;//cv::hconcat(image, CannyImage, combined);//cv::imshow(图像, combined);cv::waitKey(0);} matLab中的提取像素坐标序列从1开始 而 opencv是从0开始所以坐标相差1是正常的 本文中为了像matLab对齐采用了补全1的方式。 如下为cmakeLists cmake_minimum_required(VERSION 3.0)project(CanDy_Demo) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)include_directories(${PROJECT_SOURCE_DIR}${PROJECT_SOURCE_DIR}/opencv4/include${PROJECT_BINARY_DIR})set(srcsmain.cpp)set(hdrs)set(uis)add_executable(${PROJECT_NAME} ${srcs} ${hdrs} ${wrapUis}) add_compile_definitions(ARMDCOMBINEDAPI_EXPORTS) add_compile_definitions(NOMINMAX)#opencv libss find_library(OPENCV_WORLD_LIBRARY opencv_world452 ${CMAKE_CURRENT_SOURCE_DIR}/Opencv4/lib)target_link_libraries(${PROJECT_NAME} #opencv lib${OPENCV_WORLD_LIBRARY})if(EXISTS ${CMAKE_SOURCE_DIR}/${DIRS_IN_SRC})execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/${DIRS_IN_SRC}${CMAKE_CURRENT_BINARY_DIR}/${DIRS_IN_SRC}) endif()#SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS /MANIFESTUAC:\levelrequireAdministrator uiAccessfalse\ /SUBSYSTEM:WINDOWS)
http://www.pierceye.com/news/50755/

相关文章:

  • icp网站建设个人网页策划书
  • 南京市建设执业资格中心网站大连网站建设主页
  • 网站域名地址查询浙江建设工程信息网官网入口网址
  • 快手做任务网站无货源电商选品软件
  • 音乐网站开发企业部门网站建设流程
  • 个体户 网站建设wordpress 插件 更新
  • 深圳市网站建设公电商网站规划的开发背景
  • 上街区网站建设视频直播网站开发运营步骤
  • 网站后期维护流程人武部正规化建设的意义
  • 不规则网站模板每天做特卖的网站是哪个
  • 做微信的网站秀客搜索引擎营销广告
  • 网站开发平台介绍wordpress 添加侧边栏
  • 网站建设开题报告数据库建立30个免费货源网站
  • 网站建设pdf 下载工商银行建设银行招商银行网站
  • 做网站优化如何遍文章seo顾问张智伟
  • 设计企业网站首页成都广告传媒公司前十名
  • 建设网站哪些好做网站 后端是谁来做的
  • 北京做网站好的公司青岛专业设计网站公司
  • 嘉兴做网站seo的国家企业信用系统查询系统
  • 专业做招聘的网站有哪些贵州省建设厅公示网站
  • 新网站制作怎么样seo整站优化一年价格多少
  • 阿里云建站流程天元建设集团有限公司承兑汇票兑付
  • 网站网站在国外做影视网站用什么网盘最好
  • 广州做手机网站咨询网站开发组件拖拽
  • seo关键词优化提高网站排名网站地图对网站有什么意义
  • 企业电子网站的建设案例十堰外贸网站建设
  • 青岛专业网站开发百度网站推广电话
  • 公司刚做网站在那里找图片做前端转行可以找啥工作
  • 环球易购做中东的网站网站上做播放器流量算谁的
  • 国内团购网站做的最好的是北京软件开发年薪