tii20
-
Количество публикаций
12 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем tii20
-
-
В принципе я понял почему рамку рисует, потому что, когда RIO вытягивается, картинка в нем одного размера, а окно для отображения другого, и часть окна в сером.
Думаю если убрать заработает.
И собственно вопрос) тогда в другом, как подогнать размер окна под RIO?
cvNamedWindow("V range",CV_WINDOW_AUTOSIZE);
в
-
Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается.
Идея в чем, есть изображение, достаю из него 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;
}
-
Еще одна проблема, я поменял 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?))))
-
Да действительно из 8, поставил 10 все заработало) Спасибо еще раз за помощь эта штука мне очень помогла)!
-
Спасибо ограмное! Очень крутая штука, хотел посмотреть как код работает
и застрял на такой ошибки
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> ]
Не могу понять в чем дело, если сталкивались с таким можете помочь? Гуглил и гугл мне ничего не нашел толкового
-
А в принципе смысл я придумал такой, навожу на original image мышкой на пятно, он смотрит параметры, ищет такие же параметры по всей картинке и уже начинает бинарить hsv и складывать в общую бинарку.
Я смотрю дальше , ага не все выделилось, вижу какой сегмент не выделился, тыкаю на него в любой пиксель и он бежит дальше. И так пока не помру или пока не выделю все.
-
Потому что уж слишком тяжело мне даются опорные векторы.
-
У меня такой вопрос
Я разбиваю картинку на 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? Просто хочу знать с каким диапазоном работать.
-
О спасибо большое! Начинаю мучить мозг, то что получится, обязательно поделюсь!
-
Спасибо огромное за идею. Буду идти тогда в сторону обучения нейронных сетей.
И если есть такая возможность, если есть примеры по нейро сетям с opencv, то можно ссылочку как бы это по круче реализовать.
-
Добрый день. У меня такая задача, необходимо сегментировать пятна на фото(фото больных псариазом).
У меня алгоритм в голове такой.
Картинку перевожу в HSV->разбиваю на 3 канала-> ищу по цвету, контрасту и яркости-> соединяю все в один бинарник-> и с помощью CANNY выделяю пятна и вот она радость.
Но у меня проблема, у меня стоит задача автоматизировать поиск по цвету, то есть задавать его не самому, а чтобы какой нибудь обработчик,бегал и выцеплял все значения.
Это необходимо сделать потому что, диапазон значений по H S и V у пятен достаточно большой и если задавать тривиальный например от 0 до 11 H, и т.д. многие пятна не находятся.
И собственно вопрос, как можно сделать такой обработчик, если кто нибудь сталкивался или видел, то можно плиз ссылочку, если есть такая тема в закромах форума можно ее тоже, потому что я вроде бы тут все облазил и по поиску искал, ничего не нашел.
Заранее спасибо.
cvFindContours+RIO
в OpenCV
Опубликовано · Report reply
Затупил. Не там цикл закрыл)) и с рамкой пришлось size окна подгонять под RIO.
Может кому то пригодится тема)