Opencv 你有什么奇怪的行为?

Opencv 你有什么奇怪的行为?,opencv,contour,opencv-contour,opencv-drawcontour,Opencv,Contour,Opencv Contour,Opencv Drawcontour,我从二值图像(面积小于阈值的轮廓)中过滤小斑点。 掩模是二值图像 如果我评论行 drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8); 然后,当我用0个小斑点填充后保存蒙版时,会得到奇怪的结果 我也不明白为什么行未注释时它会工作,因为 drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8); 掩码逻辑上应与输入掩码相同(除了图像周围的1像素边界) void Fi

我从二值图像(面积小于阈值的轮廓)中过滤小斑点。 掩模是二值图像

如果我评论行

 drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
然后,当我用0个小斑点填充后保存蒙版时,会得到奇怪的结果

我也不明白为什么行未注释时它会工作,因为

drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
掩码逻辑上应与输入掩码相同(除了图像周围的1像素边界)

void FilterSmallBlobs(垫子和遮罩、浮顶)
{
//作为副作用,此代码扩展了具有1像素边框的内孔,并从图像边框中删除了1像素边框。
矢量等值线;
//findContours(遮罩、轮廓、CV_RETR_列表、CV_链近似_简单);
找到的轮廓(遮罩、轮廓、CV_RETR_列表、CV_链_近似值_无);
vector badContours;//要擦除的轮廓
对于(int i=0;i<(int)等高线.size();i++)
{

如果(轮廓面积(轮廓[i]),如以下文件所述:

注意:此函数修改源图像

因此,在您的例子中,您看到的是修改图像的某些部分,而其他部分被覆盖,因为您将小斑点绘制为黑色

这段代码应该澄清这一点:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    vector<vector<Point>> contours;

    Mat1b will_be_modified = img.clone();
    findContours(will_be_modified, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

    for (int i = 0; i < contours.size(); ++i)
    {
        if (contourArea(contours[i]) < 3000)
        {
            drawContours(img, contours, i, Scalar(0), CV_FILLED);
        }
    }

    imshow("img", img);
    imshow("After findContours", will_be_modified);
    waitKey();

    return 0;
}
#包括
使用名称空间cv;
int main()
{
Mat1b img=imread(“路径到图像”,imread\U灰度);
矢量等值线;
Mat1b将被修改=img.clone();
找到的轮廓(将被修改,轮廓,重建列表,链近似简单);
对于(int i=0;i
结果:

图像传递到
findContours


在FindCountors中使用mask.clone(),否则将修改mask并显示奇怪的内容artifact@Miki不明白它有什么帮助,我需要修改蒙版,我用0填充坏轮廓。
findContours
修改输入图像
mask
。您只在未绘制的大斑点“下方”看到修改的部分使用
findContours(mask.clone(),…
,就可以了。
#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

    vector<vector<Point>> contours;

    Mat1b will_be_modified = img.clone();
    findContours(will_be_modified, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

    for (int i = 0; i < contours.size(); ++i)
    {
        if (contourArea(contours[i]) < 3000)
        {
            drawContours(img, contours, i, Scalar(0), CV_FILLED);
        }
    }

    imshow("img", img);
    imshow("After findContours", will_be_modified);
    waitKey();

    return 0;
}