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

京东联盟建网站桂阳网站制作

京东联盟建网站,桂阳网站制作,百度网站开发合同范本,wordpress 待办事项在OpenCV中#xff0c;轮廓#xff08;contours#xff09;是图像处理中的一个重要概念#xff0c;通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API#xff0c;可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…      在OpenCV中轮廓contours是图像处理中的一个重要概念通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContours 函数用于在二值图像中查找轮廓。 void findContours(InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset Point() ); image: 输入的二值图像通常为灰度图并经过阈值处理。 contours: 检测到的轮廓以std::vectorstd::vectorPoint形式存储。 hierarchy: 轮廓的拓扑信息以std::vectorVec4i形式存储。 mode: 轮廓检索模式如RETR_EXTERNAL, RETR_LIST, RETR_CCOMP, RETR_TREE。 method: 轮廓逼近方法如CHAIN_APPROX_SIMPLE, CHAIN_APPROX_TC89_L1, CHAIN_APPROX_TC89_KCOS, CHAIN_APPROX_NONE。 offset: 可选的轮廓偏移量。 2.绘制轮廓 drawContours 函数用于在图像上绘制轮廓。 void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar color, int thickness 1, int lineType LINE_8, InputArray hierarchy noArray(), int maxLevel INT_MAX, Point offset Point() ); image: 输出的图像。 contours: 轮廓以std::vectorstd::vectorPoint形式存储。 contourIdx: 指定要绘制的轮廓索引-1表示绘制所有轮廓。 color: 轮廓的颜色。 thickness: 轮廓线的厚度。负值表示填充轮廓。 lineType: 轮廓线的类型。 hierarchy: 可选的轮廓拓扑信息用于指定绘制的轮廓层次。 maxLevel: 绘制轮廓的最大层次深度。 offset: 可选的轮廓偏移量。 3.轮廓近似 approxPolyDP 函数用于对轮廓进行多边形逼近。 void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed); curve: 输入的轮廓。 approxCurve: 输出的逼近多边形。 epsilon: 逼近精度表示轮廓到逼近多边形的最大距离。 closed: 指示逼近多边形是否闭合。 4.轮廓面积和周长 contourArea 和 arcLength 函数分别用于计算轮廓的面积和周长。 double contourArea(InputArray contour, bool oriented false); double arcLength(InputArray curve, bool closed); contour: 输入的轮廓。 oriented: 当为true时返回有符号面积正值表示逆时针方向负值表示顺时针方向。 curve: 输入的轮廓或曲线。 closed: 指示曲线是否闭合。 5.轮廓矩 moments 函数用于计算轮廓的矩。 Moments moments(InputArray array, bool binaryImage false); array: 输入的轮廓或图像。 binaryImage: 当为true时假定输入图像为二值图像。 Moments结构体包含各种矩如m00, m10, m01, m20, m11, m02等可以用来计算轮廓的几何属性,具体有 a.空间矩Spatial Moments 空间矩是图像像素位置与其灰度值的加权和它们描述了图像的整体分布。在 cv::Moments 结构体中空间矩包括 m00零阶矩表示图像的总亮度或质量。 m10一阶矩关于 x 轴的分量描述了图像在 x 方向上的亮度分布。 m01一阶矩关于 y 轴的分量描述了图像在 y 方向上的亮度分布。 m20、m11、m02二阶矩分别描述了图像在 x2 方向上的亮度分布。 m30、m21、m12、m03三阶矩进一步描述了图像的高阶亮度分布特性。 b.中心矩Central Moments 中心矩是相对于图像重心的矩它们描述了图像形状相对于重心的分布。在 cv::Moments 结构体中中心矩包括 mu20、mu11、mu02二阶中心矩分别描述了图像形状在 x2 方向上的相对于重心的分布。 mu30、mu21、mu12、mu03三阶中心矩进一步描述了图像形状的高阶相对于重心的分布特性。 c.中心归一化矩Normalized Central Moments 中心归一化矩是通过将中心矩除以零阶中心矩的适当幂次来得到的它们具有尺度不变性。在 cv::Moments 结构体中虽然直接没有列出归一化中心矩的成员变量 但可以通过中心矩和零阶中心矩实际上在 cv::Moments 中是 m00但注意 m00 不是中心矩这里只是为了说明归一化的概念来计算得到。 归一化中心矩的一般形式为 nu_pq mu_pq / (m00^((pq)/2 1)) 其中nu_pq 表示 pq 阶归一化中心矩mu_pq 表示 pq 阶中心矩m00 表示零阶矩。 6.获取轮廓的凸包 通过cv::convexHull()获取轮廓的凸包。 void convexHull( InputArray points, OutputArray hull, bool clockwise false, bool returnPoints true ); points即输入的二维点集 hull为输出的二维点集 clockwise决定出来的轮廓是否为顺时针方向为true时为顺时针方向 returnPoints标志为true时hull将返回点集此时为std::vectorcv::Point类型为false时hull将返回返回对应于外壳点的轮廓点的索引。 二.代码示例 1.打开一个图片 #include opencv2/opencv.hpp #include iostream int main() { // 读取图像 cv::Mat src cv::imread(path_to_image.jpg, cv::IMREAD_GRAYSCALE); if (src.empty()) { std::cerr Could not open or find the image! std::endl; return -1; } // 阈值处理 cv::Mat binary; cv::threshold(src, binary, 127, 255, cv::THRESH_BINARY); // 查找轮廓 std::vectorstd::vectorcv::Point contours; std::vectorcv::Vec4i hierarchy; cv::findContours(binary, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 绘制轮廓 cv::Mat result; cv::cvtColor(src, result, cv::COLOR_GRAY2BGR); for (size_t i 0; i contours.size(); i) { cv::drawContours(result, contours, (int)i, cv::Scalar(0, 255, 0), 2, cv::LINE_8, hierarchy, 0); } // 显示结果 cv::imshow(Contours, result); cv::waitKey(0); return 0; } 2.生成一个图像 #include iostream #include opencv2/opencv.hpp int main() { // 创建一个空白的图像 cv::Mat image cv::Mat::zeros(300, 300, CV_8UC1); // 单通道8位图像 // 在图像中间画一个白色的圆形作为轮廓 cv::circle(image, cv::Point(150, 150), 50, cv::Scalar(255), -1); // 查找图像中的轮廓 std::vectorstd::vectorcv::Point contours; cv::findContours(image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 计算轮廓的矩 cv::Moments moments cv::moments(contours[0]); // 从矩中计算质心 double cx moments.m10 / moments.m00; double cy moments.m01 / moments.m00; // 计算面积 double area moments.m00; // 在图像上标记质心 cv::circle(image, cv::Point(static_castint(cx), static_castint(cy)), 5, cv::Scalar(128), -1); // 输出质心坐标和面积 std::cout Centroid at ( cx , cy ) std::endl; std::cout Area: area std::endl; // 显示图像 cv::imshow(Contour with Centroid, image); cv::waitKey(0); return 0; }
http://www.w-s-a.com/news/45/

相关文章: