OpenCV C ++如何编写一个与Matlab的bwareaopen函数相同的函数?

时间:2014-05-23 10:33:27

标签: c++ matlab opencv

我试图将bwareaopen函数转换为OpenCV C ++ ... 我找到了这段代码,但它无法正常工作。

所以如果有人解决了这个问题并且可以帮助我,我会非常高兴。

void removeSmallBlobs(cv::Mat& im, double size)
{
    // Only accept CV_8UC1
    if (im.channels() != 1 || im.type() != CV_8U)
        return;

    // Find all contours
    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(im.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

    for (int i = 0; i < contours.size(); i++)
    {
        // Calculate contour area
        double area = cv::contourArea(contours[i]);

        // Remove small objects by drawing the contour with black color
        if (area > 0 && area <= size)
            cv::drawContours(im, contours, i, CV_RGB(0, 0, 0), -1);
    }
}

3 个答案:

答案 0 :(得分:1)

我认为你需要开启形态学操作。 Here you can see an example

或者看看这里:How to filter small segments from image in OpenCV?

答案 1 :(得分:0)

我正在使用cvBlobsLib在opencv中实现这样的功能。您应该首先编译并在项目中包含cvBlobsLib。图书馆链接位于:cvBlobsLib

因为matlab canny函数默认使用高斯模糊但opencv没有,所以首先应该对图像进行高斯模糊以减少噪声。然后你检测canny边缘,然后删除比像素测量的给定长度更短或更长的边。

这是我的代码。

#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include "BlobResult.h"

using namespace std;
using namespace cv;

void bwareaopen( Mat& img, int size);

 int main()
 {
     Mat img;
     img = imread("1.jpg");

     Mat gray;
     cvtColor(img,gray,CV_BGR2GRAY);


     GaussianBlur( gray, gray, Size(7, 7), 2, 2);
     Mat edges;
     Canny(gray,edges,50,500,5,true);
     imshow("raw edge",edges);
     bwareaopen( edges, 800);
     imshow("edge",edges);
     waitKey(0);


 }

 void bwareaopen( Mat& img, int size)
 {
     CBlobResult blobs;
     blobs = CBlobResult( img ,Mat(),4);
     blobs.Filter( blobs, B_INCLUDE, CBlobGetLength(), B_GREATER, size );

     Mat newimg(img.size(),img.type());
     newimg.setTo(0);
     for(int i=0;i<blobs.GetNumBlobs();i++)
     {
         blobs.GetBlob(i)->FillBlob(newimg,CV_RGB(255,255,255),0,0,true);
     }
     img = newimg;
 }

答案 2 :(得分:0)

我遇到了同样的问题。我改变了行

if (area > 0 && area <= size)

if (area <= size)

这是在我发现许多小斑点的区域为0.这对我有用。