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

Novi4ok

Пользователи
  • Количество публикаций

    15
  • Зарегистрирован

  • Посещение

Все публикации пользователя Novi4ok

  1. Mat управление памятью

    Спасибо заработало. Подскажите где можно новый референс мануал взять? С описанием функций cv:: ?
  2. Mat управление памятью

    Подскажите, пожалуйста, что не так? image = imread("test.png", 1); image.create(image.size(), image.type()); cvtColor(image, gray, CV_BGR2GRAY); cvThreshold(gray, gray, 100,255, CV_THRESH_BINARY); Выдает ошибку error C2664: cvThreshold: невозможно преобразовать параметр 1 из 'cv::Mat' в 'const CvArr *' До этого работал с IPLimage и cvMat не использовал. Теперь все функции предобработки ругаются на невозможность преобразования. Может конвертировать нужно. Подскажите где почитать за это дело можно?
  3. Товарищи форумчане, я OpenCV еще новичок, подскажите, пожалуйста, как решить мою проблему: Имеется изображение содержащее клетки (в прикрепленном файле) На нем нужно выровнять автоматически контраст. Затем произвести поиск объектов и каждый найденный объект сохранить в отдельный файл jpg. Как это сделать? Если можно с кодом. Почитал туториал вроде бы понял что нужно ROI использовать, это вроде понятно, а как в файл объект сохранить не понял
  4. Добрый день! Научный руководитель поставил задачу: создать программу распознающую разнообразные геометрические фигуры (примеры в прикрепленных файлах). Причем нужно получить максимум параметров (не менее 10-15), чтобы легче было отделить классы друг от друга на этапе обучения нейронной сетки. Моменты и инварианты Ху которые рассматривались на форуме - это всего лишь 1 параметр (длина контура), а на одном параметре классификатор не обучишь. Подскажите, пожалуйста, какими алгоритмами можно расширить количество параметров? У есть ли у кого-нибудь листинг нейронной сети? Если есть выложите пожалуйста, а то мне на все про все 2 недели дали!
  5. Спасибо большое! Буду разбираться.
  6. OpenCV в медицине

    Добрый день! Товарищи форумчане, если кто-нибудь сталкивался с проектами в которых решаются любые медицинские задачи , например анализ медицинских изображений с клетками крови, сосудов глаза, областей головного мозга и т.д. Cкиньте, пожалуйста, ссылки в эту ветку если видели что-то подобное, буду очень благодарен. P.S: ОпенСурс проекты для анализа и классификации клеток крови по группам для меня были бы предпочтительнее.
  7. Работа с контурами

    Товарищи форумчане! Кто разбирается в моментах, объясните, плиз, в функции cvMatchShapes( Templ, result,CV_CONTOURS_MATCH_I1), где последний параметр функции,то есть метод сравнения, может принимать 3 значения: CV_CONTOURS_MATCH_I1 CV_CONTOURS_MATCH_I2 CV_CONTOURS_MATCH_I3 Поясните, пожалуйста, откуда взялись эти формулы? Из какого уравнения выведены, по какому принципу идет сравнение? На одном и том же тестовом изображении поочередно применяю разные методы сравнения и, о чудо, значения моментов сильно изменяются. Зачем так много вариантов сравнения контуров?
  8. Работа с контурами

    Угу, понятно. А вот я решил просчитать инварианты Ху вот таким образом cvGetHuMoments(&moments,&hu_moments). Подскажите, как сравнить с помощью cvMatchShapes два объекта по их 7 инвариантам? Я так понял это будет точнее сравнение, чем через моменты.
  9. Работа с контурами

    Запустил проект, который на первой странице этой ветки, и не понял: "написано, что с помощью моментов в этом проекте можно однозначно отличить контур в виде круга от контура в виде квадрата и т.д." а результат получается с точностью да наоборот (в прикрепленном файле). Может сравнение идет по площадям или по длине точек контура? Проект интересный, хотелось бы разобраться .
  10. Работа с контурами

    Окружности даже чуть-чуть соприкасаются и уже считаются одним контуром. Может все таки как-то можно с помощью Хафа их разделять на отдельные окружности/контуры? Прикрепил картинки до и после работы программы. Исходник.bmp Результат.bmp
  11. Работа с контурами

    Спасибо, попробую. И еще один очень важный для меня вопрос: Допустим нашлись все контуры на изображении. Каким образом можно сделать так, чтобы в отдельном окне появлялась нарезка (галерея) найденных контуров/объектов? То есть, обведенный контуром объект копировался без фона и вырисовывался в отдельном окне, и каждый следующий объект копировался и вырисовывался в это же окно следом за предыдущим?
  12. Работа с контурами

    Насчет Хафа это интересно, конечно, но при этом нужно знать минимальный радиус и максимальный, а если наугад диапазон ставить, то он вообще все окружности выделит и тогда не понятно будет какая из окружностей эталон. К тому же Хаф обычно используется после какого-либо детектора границ типа Кенни, а он разрывы в контуре дает и двойные контуры в придачу, что в свою очередь добавляет проблем.
  13. Работа с контурами

    Поставлена интересная задача: У меня на изображении около 50 окружностей (несколько идеальных окружностей и множество окружностей с искаженной формой-обкусанные, сжатые). Сначала мне нужно обозначить идеальную окружность (эталон), чтобы все остальные сравнивались с ним впоследствии. Скажите возможно ли щелчком мыши по изображению в области эталона как-то тем самым обозначить этот эталон, чтобы при вычислении моментов он имел значение равное нулю, а все остальные объекты на изображении с ним сравнивались? Либо есть способ легче?
  14. Работа с контурами

    Осталось немного ошибок, вот текст: 1>------ Построение начато: проект: CircleDetection, Конфигурация: Debug Win32 ------ 1>Компиляция... 1>CircleDetection.cpp 1>d:\visual c++ projects\circledetection.cpp(24) : warning C4305: инициализация: усечение из 'double' к 'float' 1>d:\visual c++ projects\circledetection.cpp(92) : warning C4244: инициализация: преобразование 'double' в 'float', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(93) : warning C4244: инициализация: преобразование 'double' в 'float', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(130) : warning C4244: аргумент: преобразование 'float' в 'int', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(130) : warning C4244: аргумент: преобразование 'float' в 'int', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(132) : warning C4244: аргумент: преобразование 'float' в 'int', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(132) : warning C4244: аргумент: преобразование 'float' в 'int', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(145) : warning C4244: =: преобразование 'double' в 'float', возможна потеря данных 1>d:\visual c++ projects\circledetection.cpp(166) : fatal error C1075: конец файла обнаружен ранее, чем левая фигурная скобка '{' в "d:\visual c++ projects\circledetection.cpp(42)" 1>Журнал построения был сохранен в "file://d:\Visual C++ Projects\Debug\BuildLog.htm" 1>CircleDetection - ошибок 1, предупреждений 8 Было 34 ошибки, все поисправлял, осталась одна. Просто у меня сложности с переводом с БИЛДЕРА на СТУДИЮ, т.к. с БИЛДЕРОМ не работал никогда. Со скобками явно запутался, а распутаться не могу.
  15. Работа с контурами

    Здравствуйте! Меня очень заинтересовал этот алгоритм с 1-й страницы этой темы. Скопировал листинг с сообщения от Alex_grem, запустил проект, а не тут-то было (выдает пару ошибок). Дело в том, что я новичок в OpenCV и хоть прибей не понимаю что именно тут не правильно. Товарищи форумчане, посмотрите пожалуйста что не так. Мне главное чтобы проект запустился, а дальше я сам разберусь. Вот код который я пытался запустить на примере одного изображения, без захвата с камеры: #include "stdafx.h" #include <cv.h> #include <highgui.h> int main(int argc, char* argv[]) { int Val=100,Val1=100; // Значение переменной (для разных нужд) float edge_thresh=100; #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) CvFont font; // Описатель шрифта cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) IplImage* frame = cvLoadImage("123.jpg", 0); //исходное изображение IplImage* frame_copy = cvCloneImage(frame); IplImage* gray = cvCloneImage(frame); frame_copy = cvCreateImage( cvSize(frame->width,frame->height),IPL_DEPTH_8U, frame->nChannels ); gray = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1); //////////////////////////////////////////////Основная функция/////////////////////////////////////////////////////////////// float pi=3.1415; float XC[1000]={0}; float YC[1000]={0}; float S[1000]={0}; double mt=0; int ID=0; int NumCont=0; int NumCont1=0; CvMemStorage* storage = 0; CvSeq* contours; CvSeq* Templ; CvSeq* result; storage = cvCreateMemStorage(0); CvSeq* polygons = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage ); CvMoments moments; CvHuMoments hu_moments; while(1) { cvCvtColor(frame, gray, CV_BGR2GRAY); // Получаем серый цвет cvThreshold( gray, gray, 150,255,CV_THRESH_BINARY); // Необходимо удалить белый бордюр cvRectangle(gray, cvPoint(0,0), cvPoint(gray->width-1,gray->height-1),CV_RGB(0,0,0)); // Утолщаем контуры cvDilate( gray, gray, 0, 1 ); // Нах. границы cvCanny( gray, gray, 50, Val1, 5 ); // Нах. контуры cvFindContours( gray, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); //-------------- if(contours!=0) { NumCont=contours->total; // количество найденных контуров } int NC=0; for(;contours!=0;contours = contours->h_next) { // Аппр. контуров полигонами result = cvApproxPoly( contours, sizeof(CvContour), storage,CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.001, 0 ); // Площадь полигона double area=fabs(cvContourArea(result,CV_WHOLE_SEQ)); // Объявление читалки точек CvSeqReader reader; // Инициализация читалки точек cvStartReadSeq( result, &reader, 0 ); // Две точки CvPoint pt[2]; if(area>500) { // Вычисляем моменты cvMoments( result, &moments); [color="#FF0000"]cvGetHuMoments(&moments,&hu_moments); char m = cvWaitKey(33); if( m == 109) { printf("Hu1 = ", hu_moments.hu1,"\n"); printf("Hu2 = ", hu_moments.hu2,"\n"); printf("Hu3 = ", hu_moments.hu3,"\n"); printf("Hu4 = ", hu_moments.hu4,"\n"); printf("Hu5 = ", hu_moments.hu5,"\n"); printf("Hu6 = ", hu_moments.hu6,"\n"); printf("Hu7 = ", hu_moments.hu7,"\n"); // Центр тяжести float xc=(moments.m10/moments.m00); float yc=(moments.m01/moments.m00); // Обрубаем клонов bool ok=1; for (int o=0;o<NC;o++) { if( ((xc-XC[o])*(xc-XC[o])+(yc-YC[o])*(yc-YC[o]))<10 && fabs((area-S[o])/(area+S[o]))<0.3){ok=0;} } // if(ok){ // Запоминаем шаблон if(NumCont1==0) {Templ=cvCloneSeq(result);} // Сравниваем с найденными контурами mt=cvMatchShapes( Templ, result,CV_CONTOURS_MATCH_I3); NumCont1++; double M00=moments.m00; double M20=moments.m20; double M02=moments.m02; double M11=moments.m11; double A=(M20/M00)-xc*xc; double B=2*((M11/M00)-xc*yc); double C=(M02/M00)-yc*yc; double LL=sqrt( ( (A+C)+sqrt(B*B+(A-C)*(A-C)) )/2)*2; double LW=sqrt( ( (A+C)-sqrt(B*B+(A-C)*(A-C)) )/2)*2; // Для вычисления угла нужны центральные моменты инерции M20=moments.mu20; M02=moments.mu02; M11=moments.mu11; double theta=(atan2(2*M11,(M02-M20))/2)*(180/pi); // Отмечаем центр cvCircle( frame, cvPoint(xc,yc), 3, CV_RGB(0,255,255), -1, 8, 0 ); //string str1 = str(format("%lf") % mt); _fcvt_s(NumChar, 10, mt, 2, &Decimal, &Sign); cvPutText( frame,NumChar, cvPoint(xc,yc),&font, CV_RGB(255,255,0)); // Достаем точки из хранилища точек и рисуем линии for (int i=0;i<result->total-1;i++) { CV_READ_SEQ_ELEM( pt[0], reader ); CV_READ_SEQ_ELEM( pt[1], reader ); if(mt>0.5){cvLine(frame,pt[0],pt[1],CV_RGB(255,0,0));} else{cvLine(frame,pt[0],pt[1],CV_RGB(0,255,0));} } } XC[NC]=xc; YC[NC]=yc; S[NC]=area; NC++; } // if } // for cvPutText( frame,"NCont1=", cvPoint(20,20),&font, CV_RGB(255,255,0)); //--------------------------------------------------------------------------------------------------------------------------// cvShowImage("original",frame); //отображаем исходное изобр. while(1) { if (cvWaitKey(33) > 0) break; } cvReleaseImage(&frame); cvReleaseImage(&frame_copy); cvReleaseImage(&gray); cvDestroyAllWindows(); return 0; }
×