David 0 Жалоба Опубликовано May 23, 2013 Во время запуска функции заполнения областей изображения - аналога матлабовской 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; } код взят отсюда Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 23, 2013 функцию main добавьте. Это точка входа в С программах. Загрузите изображение, и вызовите ту функцию, которую привели выше. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 23, 2013 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; } Ошибки устранены.Вот загружаемая картинка:, но на выходе пустое окно. подскажите пожалуйста, что не так? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 23, 2013 Дык dst=imfill(src); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 23, 2013 Smorodov, исправил - теперь выдает ошибку: Необработанное исключение в "0x75ecc6e3" в "Adaptation1.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0015f4c0.. нажимаю продолжить: Adaptation1.exe привело в действие точку остановка Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 23, 2013 Если объявить так, должно работать: void imfill(IplImage* src,IplImage* dst) только изображение dst нужно создавать и разрушать в функции main. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 23, 2013 что получилось: 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; } может проще приспособить этот код? 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 579 Жалоба Опубликовано May 23, 2013 Разберитесь с передачей параметров функции в С (в данном случае передаются указатели), тогда легко поправите. А не понимая приспосабливать будете - Франкенштейн получится Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 Smorodov, никак не могу разобраться, подскажите пожалуйста Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 25, 2013 У меня так работает: 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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
David 0 Жалоба Опубликовано May 25, 2013 Smorodov, спасибо и у меня заработало!Вот результат: Если поменять режим поиска и метод аппроксимации можно добить примерно такого результата? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 25, 2013 Проблема в том, что у вас есть пиксели, имеющие значение близкое к нулю, и близкое к 255, но не равные им. Проведите бинаризацию перед применением функции заливки (см. cvThreshold). Попробуйте еще эту: http://www.compvision.ru/forum/index.php?showtopic=934 она медленнее конечно, но может быть Вам больше подойдет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах