Novi4ok
-
Количество публикаций
15 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем Novi4ok
-
-
Подскажите, пожалуйста, что не так?
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 не использовал. Теперь все функции предобработки ругаются на невозможность преобразования. Может конвертировать нужно.
Подскажите где почитать за это дело можно?
-
Товарищи форумчане, я OpenCV еще новичок, подскажите, пожалуйста, как решить мою проблему:
Имеется изображение содержащее клетки (в прикрепленном файле)
На нем нужно выровнять автоматически контраст.
Затем произвести поиск объектов и каждый найденный объект сохранить в отдельный файл jpg.
Как это сделать? Если можно с кодом. Почитал туториал вроде бы понял что нужно ROI использовать, это вроде понятно, а как в файл объект сохранить не понял
-
Спасибо большое! Буду разбираться.
-
Добрый день!
Научный руководитель поставил задачу: создать программу распознающую разнообразные геометрические фигуры (примеры в прикрепленных файлах).
Причем нужно получить максимум параметров (не менее 10-15), чтобы легче было отделить классы друг от друга на этапе обучения нейронной сетки.
Моменты и инварианты Ху которые рассматривались на форуме - это всего лишь 1 параметр (длина контура), а на одном параметре классификатор не обучишь.
Подскажите, пожалуйста, какими алгоритмами можно расширить количество параметров?
У есть ли у кого-нибудь листинг нейронной сети? Если есть выложите пожалуйста, а то мне на все про все 2 недели дали!
-
Добрый день!
Товарищи форумчане, если кто-нибудь сталкивался с проектами в которых решаются любые медицинские задачи , например анализ медицинских изображений с клетками крови, сосудов глаза, областей головного мозга и т.д.
Cкиньте, пожалуйста, ссылки в эту ветку если видели что-то подобное, буду очень благодарен.
P.S: ОпенСурс проекты для анализа и классификации клеток крови по группам для меня были бы предпочтительнее.
-
Товарищи форумчане!
Кто разбирается в моментах, объясните, плиз, в функции cvMatchShapes( Templ, result,CV_CONTOURS_MATCH_I1),
где последний параметр функции,то есть метод сравнения, может принимать 3 значения:
CV_CONTOURS_MATCH_I1
CV_CONTOURS_MATCH_I2
CV_CONTOURS_MATCH_I3
Поясните, пожалуйста, откуда взялись эти формулы?
Из какого уравнения выведены, по какому принципу идет сравнение?
На одном и том же тестовом изображении поочередно применяю разные методы сравнения и, о чудо, значения моментов сильно изменяются. Зачем так много вариантов сравнения контуров?
-
Все правильно. Посмотрите на цифры, у квадратов они очень близкие по значению. У кругов будут очень близко к нулю (к нулевому контуру). Фигуры симметричные. К тому же, квадрат - это грубое приближение круга , поэтому значения достаточно близкие. А порог когда контур рисуется красным я устанавливал эмпирически (от балды).
Если взять фигуры посложнее (вытянутые, или составные, или человечеки см. http://www.compvision.ru/forum/index.php?showtopic=6 ) значения будут различаться сильнее.
Угу, понятно. А вот я решил просчитать инварианты Ху вот таким образом cvGetHuMoments(&moments,&hu_moments).
Подскажите, как сравнить с помощью cvMatchShapes два объекта по их 7 инвариантам?
Я так понял это будет точнее сравнение, чем через моменты.
-
Запустил проект, который на первой странице этой ветки, и не понял:
"написано, что с помощью моментов в этом проекте можно однозначно отличить контур в виде круга от контура в виде квадрата и т.д."
а результат получается с точностью да наоборот (в прикрепленном файле).
Может сравнение идет по площадям или по длине точек контура?
Проект интересный, хотелось бы разобраться .
-
п.с. у вас окружности пересекаются? если да то тогда через моменты-контуры нельзя будет сделать.
хаф будет скорее всего не точен.
chamfer matching поможет найти положение объекта, но сравнивать объекты между собой надо будет каким то другом методом.
Окружности даже чуть-чуть соприкасаются и уже считаются одним контуром. Может все таки как-то можно с помощью Хафа их разделять на отдельные окружности/контуры?
Прикрепил картинки до и после работы программы.
-
Если внимательно почитать про моменты Ху, то там говорится, что эти моменты не чуствительны к масштабу и повороту.
Из этого следует, что моменты Ху для окружности можно посчитать только один раз. И сравнивать дальше с ними.
Что касается Хафа, то он не чувствителен к разрывам контура, диапазон значений радиусов, да, лучше знать. Но можно контуры отсеивать по значению периметра.
Выделение эталона мышкой тоже не сложно сделать. Щелкаем мышью, запоминаем точку и находим окружность с центром наиболее близким к этой точке.
Или выделить окошком ROI найти там самую большую окружность, это и будет эталон. Затем сбросить ROI и проводить сравнение дальше.
Спасибо, попробую.
И еще один очень важный для меня вопрос: Допустим нашлись все контуры на изображении. Каким образом можно сделать так, чтобы в отдельном окне появлялась нарезка (галерея) найденных контуров/объектов?
То есть, обведенный контуром объект копировался без фона и вырисовывался в отдельном окне, и каждый следующий объект копировался и вырисовывался в это же окно следом за предыдущим?
-
задать эталонную окружность математически и сравнивать все окружности с ней.
можно искать окружности через преобразование хафа.
Насчет Хафа это интересно, конечно, но при этом нужно знать минимальный радиус и максимальный, а если наугад диапазон ставить, то он вообще все окружности выделит и тогда не понятно будет какая из окружностей эталон.
К тому же Хаф обычно используется после какого-либо детектора границ типа Кенни, а он разрывы в контуре дает и двойные контуры в придачу, что в свою очередь добавляет проблем.
-
Поставлена интересная задача:
У меня на изображении около 50 окружностей (несколько идеальных окружностей и множество окружностей с искаженной формой-обкусанные, сжатые).
Сначала мне нужно обозначить идеальную окружность (эталон), чтобы все остальные сравнивались с ним впоследствии.
Скажите возможно ли щелчком мыши по изображению в области эталона как-то тем самым обозначить этот эталон, чтобы при вычислении моментов он имел значение равное нулю, а все остальные объекты на изображении с ним сравнивались?
Либо есть способ легче?
-
Текст ошибок-то имеется ?
Осталось немного ошибок, вот текст:
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 ошибки, все поисправлял, осталась одна. Просто у меня сложности с переводом с БИЛДЕРА на СТУДИЮ, т.к. с БИЛДЕРОМ не работал никогда.
Со скобками явно запутался, а распутаться не могу.
-
Здравствуйте!
Меня очень заинтересовал этот алгоритм с 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; }
Mat управление памятью
в OpenCV
Опубликовано · Report reply
Спасибо заработало. Подскажите где можно новый референс мануал взять? С описанием функций cv:: ?