Перейти к содержимому
Compvision.ru
David

Заполнение отверстий

Recommended Posts

Во время запуска функции заполнения областей изображения - аналога матлабовской imfill(BW, 'holes'), возникают след. ошибки:

Ошибка	4	error LNK1120: 1 неразрешенных внешних элементов	C:\Adaptation1\Release\Adaptation1.exe

Ошибка	3	error LNK2001: неразрешенный внешний символ "_main"	C:\Adaptation1\Adaptation1\MSVCRT.lib(crtexe.obj)

Помогите пожалуйста устранить их, код :
#include "stdafx.h"


#include <cv.h>

#include <highgui.h>

#include <stdlib.h>

#include <stdio.h>


IplImage* imfill(IplImage* src)

{

    CvScalar white = CV_RGB( 255, 255, 255 );


    IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);

    CvMemStorage* storage = cvCreateMemStorage(0);

    CvSeq* contour = 0;


    cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

    cvZero( dst );


    for( ; contour != 0; contour = contour->h_next )

    {

        cvDrawContours( dst, contour, white, white, 0, CV_FILLED);

    }


    IplImage* bin_imgFilled = cvCreateImage(cvGetSize(src), 8, 1);

    cvInRangeS(dst, white, white, bin_imgFilled);


    return bin_imgFilled;

}

код взят отсюда

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

функцию main добавьте.

Это точка входа в С программах.

Загрузите изображение, и вызовите ту функцию, которую привели выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

IplImage* imfill(IplImage* src)

{

    CvScalar white = CV_RGB( 255, 255, 255 );


    IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);

    CvMemStorage* storage = cvCreateMemStorage(0);

    CvSeq* contour = 0;


    cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

    cvZero( dst );


    for( ; contour != 0; contour = contour->h_next )

    {

        cvDrawContours( dst, contour, white, white, 0, CV_FILLED);

    }


    IplImage* bin_imgFilled = cvCreateImage(cvGetSize(src), 8, 1);

    cvInRangeS(dst, white, white, bin_imgFilled);


    return bin_imgFilled;

}


int _tmain(int argc, _TCHAR* argv[])  

{  




    IplImage *src = 0,*dst=0;  


    src = cvLoadImage("70.jpg");     


    IplImage* imfill(src);


    cvShowImage("Output", dst);   



    cvWaitKey(0);  


    cvReleaseImage(&dst);

    cvDestroyWindow("Output");  

    return 0;  

}

Ошибки устранены.Вот загружаемая картинка:post-6404-0-78409800-1369332847_thumb.jp, но на выходе пустое окно. подскажите пожалуйста, что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дык

dst=imfill(src);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, исправил - теперь выдает ошибку:

 Необработанное исключение в "0x75ecc6e3" в "Adaptation1.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0015f4c0..
нажимаю продолжить:
Adaptation1.exe привело в действие точку остановка

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если объявить так, должно работать:

void imfill(IplImage* src,IplImage* dst)

только изображение dst нужно создавать и разрушать в функции main.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

что получилось:

void imfill(IplImage* src,IplImage* dst)

{

    CvScalar white = CV_RGB( 255, 255, 255 );


    IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);

    CvMemStorage* storage = cvCreateMemStorage(0);

    CvSeq* contour = 0;


    cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

    cvZero( dst );


    for( ; contour != 0; contour = contour->h_next )

    {

        cvDrawContours( dst, contour, white, white, 0, CV_FILLED);

    }


    IplImage* bin_imgFilled = cvCreateImage(cvGetSize(src), 8, 1);

    cvInRangeS(dst, white, white, bin_imgFilled);


    return bin_imgFilled;

}
post-6404-0-38588900-1369335473_thumb.pn может проще приспособить этот код?
        Image<Gray, byte> image = new Image<Gray, byte>(@"D:\final.bmp");

        CvInvoke.cvShowImage("image 1", image);


        var contours = image.FindContours();

        while (contours != null)

        {

            CvInvoke.cvDrawContours(image, contours, new Gray(255).MCvScalar, new Gray (255).MCvScalar, 0, -1, Emgu.CV.CvEnum.LINE_TYPE.CV_AA, new DPoint(0, 0));

            contours = contours.HNext;

        }

        CvInvoke.cvShowImage("image 2", image);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Разберитесь с передачей параметров функции в С (в данном случае передаются указатели), тогда легко поправите.

А не понимая приспосабливать будете - Франкенштейн получится :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, никак не могу разобраться, подскажите пожалуйста

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня так работает:


void imfill(IplImage* src, IplImage* bin_imgFilled)
{
CvScalar white = CV_RGB( 255, 255, 255 );

IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;

cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
cvZero( dst );

for( ; contour != 0; contour = contour->h_next )
{
cvDrawContours( dst, contour, white, white, 0, CV_FILLED);
}


cvInRangeS(dst, white, white, bin_imgFilled);
}

int main(int argc, char* argv[])
{

IplImage *src = 0;

src = cvLoadImage("D://ImagesForTest//BWHoles.png",0);

IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1);

imfill(src,dst);

cvShowImage("Output", dst);


cvWaitKey(0);

cvReleaseImage(&dst);
cvReleaseImage(&src);

cvDestroyWindow("Output");
return 0;
}
[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, спасибо и у меня заработало!Вот результат:

post-6404-0-99352300-1369484085_thumb.jp

Если поменять режим поиска и метод аппроксимации можно добить примерно такого результата?

post-6404-0-54526500-1369484074_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема в том, что у вас есть пиксели, имеющие значение близкое к нулю, и близкое к 255, но не равные им. Проведите бинаризацию перед применением функции заливки (см. cvThreshold).

Попробуйте еще эту:

http://www.compvision.ru/forum/index.php?showtopic=934

она медленнее конечно, но может быть Вам больше подойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×