美文网首页
opencv轮廓求面积

opencv轮廓求面积

作者: 落炜 | 来源:发表于2018-12-05 20:25 被阅读0次

官方给出求轮廓面积的函数是contourArea(),但是实际使用时发现该值并不是区域内亮点的像素值。contourArea是根据 Green formula计算得到的,具体计算上的差别可以参考这张图,实际7个像素,计算出来是2.5

白线经过的像素是1,其余(2,1)(3,3)为0
这让用惯halcon的我有点难以接受,于是寻思着怎么得到另一种面积(区域内亮像素的个数)。
搜索了一遍发现opencv3.x的connectedComponentsWithStats()可以实现这个功能,由于之前的功能都是在2.X版本下做的,一时不好切换,还是先自己搞一搞,使用opencv3.x的童鞋可以到这里了解~

方案一:
使用findContours找到轮廓之后,以其中一个轮廓点为起点,使用广度优先算法遍历搜索相邻的像素,统计亮点个数,具体实现如下~

const int offsetX[4] = { -1, 0, 1, 0 };
const int offsetY[4] = { 0, -1, 0, 1 };
int getContourArea(Mat &binImg, Point anchorPoint)
{
    /*
    取轮廓上的一点anchorPoint,计算与anchorPoint连通的所有点的个数
    */
    CV_Assert(binImg.type() == CV_8UC1);
    int w = binImg.size().width;
    int h = binImg.size().height;
    Mat flag = Mat::zeros(binImg.size(), CV_8UC1);
    Point tmp, currentPoint;
    int count = 0;
    queue<Point> v1;
    v1.push(anchorPoint);
    flag.ptr<uchar>(anchorPoint.y)[anchorPoint.x] = 1;
    while (!v1.empty())
    {
        currentPoint = v1.front();
        v1.pop(); 
        count++;
        for (size_t i = 0; i < 4; i++)
        {
            tmp.x = currentPoint.x + offsetX[i];
            tmp.y = currentPoint.y + offsetY[i];
            if (tmp.x >= 0
                && tmp.y >= 0
                && tmp.x < w
                && tmp.y < h                //在矩形区域内计算
                &&flag.ptr<uchar>(tmp.y)[tmp.x] != 1)
            {
                if (binImg.ptr<uchar>(tmp.y)[tmp.x]>0)//需要补充
                {
                    //记录未处理的值
                    v1.push(tmp);
                }
                flag.ptr<uchar>(tmp.y)[tmp.x] = 1;
            }
        }
    }
    return count;
}

【待更。。】

相关文章

  • opencv轮廓求面积

    官方给出求轮廓面积的函数是contourArea(),但是实际使用时发现该值并不是区域内亮点的像素值。contou...

  • Opencv contourArea轮廓面积检测

    contourArea Calculates a contour area. Parameters:contour...

  • Python + Opencv 实现轮廓提取,轮廓区域面积计

    Python + Opencv2 实现轮廓提取,轮廓区域面积计算; 对图像处理时,会遇到这样一个场景:找到图像主体...

  • 【OPENCV】轮廓检测

    Tags: DIP findContours() void findContours(InputOutputArr...

  • opencv图像轮廓

    1.1什么是轮廓 cv2.findContours() 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有...

  • opencv 轮廓检测

  • openCV:图像轮廓

    查找轮廓 什么是轮廓 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析...

  • OpenCV 之轮廓

    什么是轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的...

  • OpenCV 查找轮廓

    本文将结合实例代码,介绍 OpenCV 如何查找轮廓、获取边界框。 代码: contours.py[https:/...

  • opencv细化轮廓

    1.源码实现 2.编译源码 3.运行及其结果

网友评论

      本文标题:opencv轮廓求面积

      本文链接:https://www.haomeiwen.com/subject/uwbafqtx.html