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

Novi4ok

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

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

  • Посещение

Сообщения, опубликованные пользователем Novi4ok


  1. Подскажите, пожалуйста, что не так?

    
        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 не использовал. Теперь все функции предобработки ругаются на невозможность преобразования. :( Может конвертировать нужно.

    Подскажите где почитать за это дело можно?


  2. Товарищи форумчане, я OpenCV еще новичок, подскажите, пожалуйста, как решить мою проблему:

    Имеется изображение содержащее клетки (в прикрепленном файле)

    На нем нужно выровнять автоматически контраст.

    Затем произвести поиск объектов и каждый найденный объект сохранить в отдельный файл jpg.

    Как это сделать? Если можно с кодом. Почитал туториал вроде бы понял что нужно ROI использовать, это вроде понятно, а как в файл объект сохранить не понял :(

    post-4351-0-17213600-1351363817_thumb.jp


  3. Добрый день!

    Научный руководитель поставил задачу: создать программу распознающую разнообразные геометрические фигуры (примеры в прикрепленных файлах).

    Причем нужно получить максимум параметров (не менее 10-15), чтобы легче было отделить классы друг от друга на этапе обучения нейронной сетки.

    Моменты и инварианты Ху которые рассматривались на форуме - это всего лишь 1 параметр (длина контура), а на одном параметре классификатор не обучишь.

    Подскажите, пожалуйста, какими алгоритмами можно расширить количество параметров?

    У есть ли у кого-нибудь листинг нейронной сети? Если есть выложите пожалуйста, а то мне на все про все 2 недели дали!

    post-4351-0-55641600-1333085818_thumb.jp

    post-4351-0-77677700-1333085826_thumb.jp

    post-4351-0-79294200-1333085834_thumb.jp

    post-4351-0-48474700-1333085846_thumb.jp

    post-4351-0-71410300-1333085865_thumb.jp

    post-4351-0-32145000-1333085876_thumb.jp

    post-4351-0-98455400-1333085885_thumb.jp

    post-4351-0-50976200-1333085892_thumb.jp


  4. Добрый день!

    Товарищи форумчане, если кто-нибудь сталкивался с проектами в которых решаются любые медицинские задачи :nurse: , например анализ медицинских изображений с клетками крови, сосудов глаза, областей головного мозга и т.д.

    Cкиньте, пожалуйста, ссылки в эту ветку если видели что-то подобное, буду очень благодарен.

    P.S: ОпенСурс проекты для анализа и классификации клеток крови по группам для меня были бы предпочтительнее.


  5. Товарищи форумчане!

    Кто разбирается в моментах, объясните, плиз, в функции cvMatchShapes( Templ, result,CV_CONTOURS_MATCH_I1),

    где последний параметр функции,то есть метод сравнения, может принимать 3 значения:

    CV_CONTOURS_MATCH_I1

    256a09.jpg

    CV_CONTOURS_MATCH_I2

    fc7291.jpg

    CV_CONTOURS_MATCH_I3

    ebc204.jpg

    Поясните, пожалуйста, откуда взялись эти формулы?

    Из какого уравнения выведены, по какому принципу идет сравнение?

    На одном и том же тестовом изображении поочередно применяю разные методы сравнения и, о чудо, значения моментов сильно изменяются. Зачем так много вариантов сравнения контуров?


  6. Все правильно. Посмотрите на цифры, у квадратов они очень близкие по значению. У кругов будут очень близко к нулю (к нулевому контуру). Фигуры симметричные. К тому же, квадрат - это грубое приближение круга :rolleyes: , поэтому значения достаточно близкие. А порог когда контур рисуется красным я устанавливал эмпирически (от балды).

    Если взять фигуры посложнее (вытянутые, или составные, или человечеки см. http://www.compvision.ru/forum/index.php?showtopic=6 ) значения будут различаться сильнее.

    Угу, понятно. А вот я решил просчитать инварианты Ху вот таким образом cvGetHuMoments(&moments,&hu_moments).

    Подскажите, как сравнить с помощью cvMatchShapes два объекта по их 7 инвариантам?

    Я так понял это будет точнее сравнение, чем через моменты.


  7. Запустил проект, который на первой странице этой ветки, и не понял:

    "написано, что с помощью моментов в этом проекте можно однозначно отличить контур в виде круга от контура в виде квадрата и т.д."

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

    Может сравнение идет по площадям или по длине точек контура?

    Проект интересный, хотелось бы разобраться :mellow: .

    post-4351-0-77662200-1313847532_thumb.jp


  8. п.с. у вас окружности пересекаются? если да то тогда через моменты-контуры нельзя будет сделать.

    хаф будет скорее всего не точен.

    chamfer matching поможет найти положение объекта, но сравнивать объекты между собой надо будет каким то другом методом.

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

    Прикрепил картинки до и после работы программы.

    Исходник.bmp

    Результат.bmp


  9. Если внимательно почитать про моменты Ху, то там говорится, что эти моменты не чуствительны к масштабу и повороту.

    Из этого следует, что моменты Ху для окружности можно посчитать только один раз. И сравнивать дальше с ними.

    Что касается Хафа, то он не чувствителен к разрывам контура, диапазон значений радиусов, да, лучше знать. Но можно контуры отсеивать по значению периметра.

    Выделение эталона мышкой тоже не сложно сделать. Щелкаем мышью, запоминаем точку и находим окружность с центром наиболее близким к этой точке.

    Или выделить окошком ROI найти там самую большую окружность, это и будет эталон. Затем сбросить ROI и проводить сравнение дальше.

    Спасибо, попробую.

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

    То есть, обведенный контуром объект копировался без фона и вырисовывался в отдельном окне, и каждый следующий объект копировался и вырисовывался в это же окно следом за предыдущим?


  10. задать эталонную окружность математически и сравнивать все окружности с ней.

    можно искать окружности через преобразование хафа.

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

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


  11. Поставлена интересная задача:

    У меня на изображении около 50 окружностей (несколько идеальных окружностей и множество окружностей с искаженной формой-обкусанные, сжатые).

    Сначала мне нужно обозначить идеальную окружность (эталон), чтобы все остальные сравнивались с ним впоследствии.

    Скажите возможно ли щелчком мыши по изображению в области эталона как-то тем самым обозначить этот эталон, чтобы при вычислении моментов он имел значение равное нулю, а все остальные объекты на изображении с ним сравнивались?

    Либо есть способ легче?


  12. Текст ошибок-то имеется ?

    Осталось немного ошибок, вот текст:

    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 ошибки, все поисправлял, осталась одна. Просто у меня сложности с переводом с БИЛДЕРА на СТУДИЮ, т.к. с БИЛДЕРОМ не работал никогда.

    Со скобками явно запутался, а распутаться не могу.


  13. Здравствуйте!

    Меня очень заинтересовал этот алгоритм с 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;
    
    }
    
    

    post-4351-0-48078900-1308135122_thumb.jp

×