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

tii20

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

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

  • Посещение

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


  1. В принципе я понял почему рамку рисует, потому что, когда RIO вытягивается, картинка в нем одного размера, а окно для отображения другого, и часть окна в сером.

    Думаю если убрать заработает.

    И собственно вопрос) тогда в другом, как подогнать размер окна под RIO?

    cvNamedWindow("V range",CV_WINDOW_AUTOSIZE);

    в


  2. Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается.

    Идея в чем, есть изображение, достаю из него RIO, перевожу в hsv ищу контуры и рисую их на главном изображении.Параметры RIO задаю мышкой.

    Все работает,но

    1. проблема как можно в int contoursCont = cvFindContours( s_range, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(160,72)); передать координаты как параметры, которые выше задаются мышкой, cvPoint(160,72).

    2. когда рисуются контуры на главном изображении почему то, идет захват и рамки RIO, а не конкретного объекта. Т.е. рисуются контуры объекта и RIO. Возможно это из-за того, что параметры функции cvDrawContours и cvFindContours сырые и их надо подкрутить.

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

    Пожалуйста подскажите может у кто нибудь воевал с RIO и cvFindContours на форуме поиск не помог(.

    Заранее спасибо!

    #include <cv.h>

    #include <highgui.h>

    #include <stdlib.h>

    #include <stdio.h>

    IplImage* image = 0;

    IplImage* src = 0;

    IplImage* rio_copy= 0;

    IplImage* h_plane = 0;

    IplImage* s_plane = 0;

    IplImage* v_plane = 0;

    IplImage* h_range = 0;

    IplImage* s_range = 0;

    IplImage* v_range = 0;

    IplImage* hsv = 0;

    IplImage* rio_copy_hsv=0;

    // рисуем целеуказатель

    void drawTarget(IplImage* img, int x, int y, int radius)

    {

    cvRectangle(img,cvPoint(x,y),cvPoint(x,y), cvScalar(255,255,255));

    FILE *out;

    out=fopen("XandY.dat","w");

    fprintf(out,"%i %i ", x, y);

    fclose(out);

    }

    // обработчик событий от мышки

    void myMouseCallback( int event, int x, int y, int flags, void* param )

    {

    IplImage* img = (IplImage*) param;

    switch( event ){

    case CV_EVENT_MOUSEMOVE:

    break;

    case CV_EVENT_LBUTTONDOWN:

    printf("%d x %d\n", x, y);

    drawTarget(img, x, y, 10);

    break;

    case CV_EVENT_LBUTTONUP:

    break;

    }

    }

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

    {

    // имя картинки задаётся первым параметром

    char* filename = argc == 2 ? argv[1] : "22.jpg";

    // получаем картинку

    image = cvLoadImage(filename,1);

    // клонируем картинку

    src = cvCloneImage(image);

    rio_copy = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U,3);

    cvNamedWindow("ROI", CV_WINDOW_AUTOSIZE);

    cvNamedWindow("ROI_copy", CV_WINDOW_AUTOSIZE);

    cvCopyImage(image, rio_copy);

    printf(" image: %s\n", filename);

    assert( src != 0 );

    // окно для отображения картинки

    cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

    // вешаем обработчик мышки

    cvSetMouseCallback( "original", myMouseCallback, (void*) image);

    while(1){

    char key = cvWaitKey(0);

    // показываем картинку

    cvCopyImage( image, src );

    switch(key)

    {

    case 's':

    FILE *in;

    int m,n;

    if ((in=fopen("XandY.dat","r"))!=NULL)

    {

    fscanf(in,"%d %d", &m, &n);

    printf("NEW=%i\n", m);

    printf("NEW=%i\n", n);

    }

    m=m-10;

    n=n-10;

    int p=m; int k=n;

    // задаём ROI

    int x = argc >= 3 ? atoi(argv[2]) : m;

    int y = argc >= 4 ? atoi(argv[3]) : n;

    int width = argc >= 5 ? atoi(argv[4]) : 50;

    int height = argc >= 6 ? atoi(argv[5]) : 50;

    // добавочная величина

    //12 73 200

    //11 83 188

    // cvShowImage( "origianl", image);

    // устанавливаем ROI

    cvSetImageROI(rio_copy, cvRect(x,y,width,height));

    rio_copy_hsv = cvCreateImage( cvGetSize(rio_copy), IPL_DEPTH_8U, 3 );

    cvCopyImage(rio_copy, rio_copy_hsv);

    cvDestroyWindow("ROI");

    // cvDestroyWindow("ROI_copy");

    hsv = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 3 );

    h_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    s_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    v_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    h_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    s_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    v_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 );

    cvCvtColor( rio_copy_hsv, hsv, CV_BGR2HSV );

    cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

    cvInRangeS(h_plane, cvScalar(11), cvScalar(12), h_range);

    cvInRangeS(s_plane, cvScalar(73), cvScalar(83), s_range);

    cvInRangeS(v_plane, cvScalar(188), cvScalar(188), v_range);

    }

    cvShowImage( "H", h_plane );

    cvShowImage( "S", s_plane );

    cvShowImage( "V", v_plane );

    cvShowImage( "H range", h_range );

    cvShowImage( "S range", s_range );

    cvShowImage( "V range", v_range );

    CvMemStorage* storage = cvCreateMemStorage(0);

    CvSeq* contours=0;

    int contoursCont = cvFindContours( s_range, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(160,72));

    CvSeq* h_next=0;

    for(CvSeq* seq0 = contours;seq0!=0;seq0 = seq0->h_next){

    cvDrawContours(rio_copy, seq0, CV_RGB(0,0,0), CV_RGB(0,0,0), 0, 1, 8);

    cvShowImage("ROI_HSV", rio_copy_hsv);

    cvResetImageROI(rio_copy);

    cvShowImage("ROI", rio_copy);

    cvShowImage( "original", src );

    char c = cvWaitKey(33);

    if (c == 27) { // если нажата ESC - выходим

    break;

    }

    }

    }

    // освобождаем ресурсы

    cvReleaseImage(&image);

    cvReleaseImage(&src);

    // удаляем окно

    cvDestroyWindow("original");

    return 0;

    }


  3. Еще одна проблема, я поменял v2.3.1 на v2.4

    перегрузил комп и у меня появляются теперь ошибки,

    Необработанное исключение в "0x7c812afb" в "Obrabot4ik_v3.2.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0011ca34..

    Я так понимаю что ошибки эти, из-за того что он не может найти картинку, но я описал все верно

    Mat Img=imread("C:\\proj\\proj2\\Obrabot4ik_v3.2\\Obrabot4ik_v3.2\\21.jpg");

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

    А если вернуться в версию 2.3.1 то тоже Необработанное исключение в "0x7c812afb" в "Obrabot4ik_v3.2.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0011f130.. но вылетает только после того когда нажимаю r?))))


  4. Спасибо ограмное! Очень крутая штука, хотел посмотреть как код работает

    и застрял на такой ошибки

    c:\program files\microsoft visual studio 9.0\vc\include\sstream(333) : error C2248: 'std::basic_streambuf<_Elem,_Traits>::operator =' : cannot access private member declared in class 'std::basic_streambuf<_Elem,_Traits>'

    1> with

    1> [

    1> _Elem=char,

    1> _Traits=std::char_traits<char>

    1> ]

    1> c:\program files\microsoft visual studio 9.0\vc\include\streambuf(22) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::operator ='

    1> with

    1> [

    1> _Elem=char,

    1> _Traits=std::char_traits<char>

    1> ]

    1> This diagnostic occurred in the compiler generated function 'std::basic_stringbuf<_Elem,_Traits,_Alloc> &std::basic_stringbuf<_Elem,_Traits,_Alloc>::operator =(const std::basic_stringbuf<_Elem,_Traits,_Alloc> &)'

    1> with

    1> [

    1> _Elem=char,

    1> _Traits=std::char_traits<char>,

    1> _Alloc=std::allocator<char>

    1> ]

    Не могу понять в чем дело, если сталкивались с таким можете помочь? Гуглил и гугл мне ничего не нашел толкового


  5. А в принципе смысл я придумал такой, навожу на original image мышкой на пятно, он смотрит параметры, ищет такие же параметры по всей картинке и уже начинает бинарить hsv и складывать в общую бинарку.

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


  6. У меня такой вопрос

    Я разбиваю картинку на 3 канала. HSV. Можно ли как нибудь сделать так, чтобы допустим наводишь мышкой, на пиксель в канале ,допустим, H, и по щелчку можно было бы вывести в поток какое значение H имеет пиксель. Примерно также как и с координатами:

    void myMouseCallback( int event, int x, int y, int flags, void* param )

    {

    IplImage* img = (IplImage*) param;

    switch( event ){

    case CV_EVENT_MOUSEMOVE:

    break;

    case CV_EVENT_LBUTTONDOWN:

    printf("%d x %d\n", x, y);

    drawTarget(img, x, y, 10);

    break;

    case CV_EVENT_LBUTTONUP:

    break;

    }

    }

    Есть ли какой нибудь распознаватель у opencv для каналов HSV? Просто хочу знать с каким диапазоном работать.


  7. Добрый день. У меня такая задача, необходимо сегментировать пятна на фото(фото больных псариазом).

    У меня алгоритм в голове такой.

    Картинку перевожу в HSV->разбиваю на 3 канала-> ищу по цвету, контрасту и яркости-> соединяю все в один бинарник-> и с помощью CANNY выделяю пятна и вот она радость.

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

    Это необходимо сделать потому что, диапазон значений по H S и V у пятен достаточно большой и если задавать тривиальный например от 0 до 11 H, и т.д. многие пятна не находятся.

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

    Заранее спасибо.

×