我试图将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);
}
}
答案 0 :(得分:1)
我认为你需要开启形态学操作。 Here you can see an example
答案 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.这对我有用。