Jump to content
Compvision.ru

K0rG

Пользователи
  • Content count

    5
  • Joined

  • Last visited

Everything posted by K0rG

  1. Привет народ!) Разрабатываю систему распознавания автомобильных номерных знаков, использую библиотеку OpenCV. Алгоритм пока, что прост)... 1. Программа находит все прямоугольные элементы на фотографии (за основу взят стандартный пример из сэмплов по обнаружению парямоугольников) 2. Бинаризация изображений (т.е бинаризуются все найденые прямоугольные области функцией Threeshold) 3. Анализ каждого прямоугольника на кол-во белого цвета (Таким способом выявляется прямоугольник с номерным знаком) 4. Сегментация прямоугольника с номером 5. Распознавание символов. Итак вопросы следующие: 1. Как можно обращаться к бинаризованному изображению попиксельно?...никак не могу въехать( 2. Прямоугольники, которые были получены, хранятся в CvSeq*.Как можно вывести изображения находящееся в области каждого прямоугольника? Вот пример моей реализации...но там всплыла куча подводных камней...может есть какие-то стандартные функции для этого...может я зря страдаю...)?? void SearchNumber( IplImage* img, CvSeq* squares ) // CvSeq хранит данные о контуре { char* NameWnd2 = "Nomer"; cvNamedWindow( "Nomer", CV_WINDOW_AUTOSIZE ); CvSeqReader reader; IplImage* cpy = cvCloneImage( img ); int i,j; CvPoint pt1; CvFont font; CvSize text_size; pt1.x = 100; pt1.y = 100; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0.0, 0, CV_AA ); cvGetTextSize( "1", &font, &text_size, 0 ); // initialize reader of the sequence cvStartReadSeq( squares, &reader, 0 ); // cvSeqRemove( squares, 10); // читать 4 последовательности элементов (все вершины) for( i = 0; i < squares->total; i += 4 ) { CvPoint pt[4], *rect = pt; // Массив точек массива контура int count = 4; // Читать 4 вершины CV_READ_SEQ_ELEM( pt[0], reader ); // CV_READ_SEQ_ELEM( pt[1], reader ); // Считывание точек вершин CV_READ_SEQ_ELEM( pt[2], reader ); // CV_READ_SEQ_ELEM( pt[3], reader ); // //Поиск вершин по которым будут строится новый квадрат изображения int c,gip,max,min; max=0; min=10000; CvPoint MaxPoint; CvPoint MinPoint; MaxPoint.x=1; MaxPoint.y=1; MinPoint.x=1; MinPoint.y=1; ////Далее собсно идет мой алгоритм поиска двух вершин по которым будет строится область ROI .... ////Алгоритм крив и косячен до ужоса >_< Может есть какая-то функция заменяющая весь этот ужс???) for( j=0; j<4; j++ ) { gip= (int)sqrt ((double)((pt[j].x)*(pt[j].x)+(pt[j].y)*(pt[j].y))); if ((gip > max)&&((pt[j].y)>(MaxPoint.y))) { max = gip; MaxPoint = pt[j]; } if ((gip < min)&&((pt[j].y)<(MaxPoint.y))) { min = gip; MinPoint = pt[j]; } printf("(%d,%d)\n", pt[j].x, pt[j].y ); printf("Gipotinuza = %d,\n",gip); } printf("MaX = %d,%d\n",MaxPoint.x,MaxPoint.y); printf("MiN = %d,%d\n",MinPoint.x,MinPoint.y); cvSetImageROI(img, cvRect(MinPoint.x,MinPoint.y,MaxPoint.x,MaxPoint.y)); ////Запись квадрата в память как JPG вайл char buffer[50]; itoa(i,buffer,10); strcat(buffer,".jpg"); printf("Imia Faila: %s\n", buffer); if(!cvSaveImage(buffer, img)) { printf("Невозможно записать файл изображения\n"); } cvShowImage( NameWnd2, img ); cvResetImageROI(img); printf("************************\n"); /////Вывод номеров вершин for( j=0; j<4; j++ ) { char buffer[50]; itoa(j+1,buffer,10); cvPutText(cpy, buffer, pt[j], &font, CV_RGB(255,1,1)); } } // Вывод изображения cvShowImage( wndname, cpy ); cvReleaseImage( &cpy ); //Освобождение памяти } Очень надеюсь на вашу помощ...
  2. Большое спасибо!Разобрался) Правда назрел еще один вопрос...Пытаюсь средствами MFC осуществить поиск и выбор файла, выглядит это примерно так: CString fname; //Переменная для хранения имени файла CFile file; //обьект класса CFile CFileDialog dlgOpen(TRUE, L"txt",L"", OFN_HIDEREADONLY, L" JPEG(*.JPG;*.JPEG;*.JPE)| *.jpg|BMP(*.BMP;*.RLE;*.DIB)| *.bmp| PNG(*.PNG)|*.png| TIFF(*.TIF;*.TIFF)|*.tif| ALL Formats(*.*)|*.*|", this); if(dlgOpen.DoModal()==IDOK) { fname = dlgOpen.GetPathName(); } else return; char* FailDir = fname; //Проблемная строка Выдает ошибку: cannot convert from 'CString' to 'char *' Мало того даже если убрать проблемную строчку и написать char* FailDir = "Имя файла.жпег"; и вызвать, заранее написанную функцию, вывода изображения средствами OpenCV, выводится почему-то пустое серое окно.... А если не вызывать до этого окно поиска файла то все отображается отлично... Вот такие вот странности)
  3. Чет не пойму...опробовал функцию CV_IMAGE_ELEM(img, uchar, y, x) #include "stdafx.h" #include <cxcore.h> #include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage* img = cvLoadImage("BlonD.jpg"); char* NameWnd1 = "IMAGE"; cvNamedWindow( "IMAGE", CV_WINDOW_AUTOSIZE ); for (int y=0; y<30; y++) { for (int x=0; x<30; x++) { printf("%d ",CV_IMAGE_ELEM(img, uchar, y, x)); } printf("\n"); } cvShowImage( NameWnd1, img ); cvWaitKey(0); cvDestroyWindow(NameWnd1); return 0; } Опробовал на двухцветном изображении (ЧБ), считывал только участок 30 на 30... выдает только значение 255.....Может я что - то не так понял...может нужно в CvMat переводить..может можно вообще как-то проще по пикселям обрабатывать...что-то я совсем запутался(((
  4. Большущее спасибо, буду изучать!!!)Как только закончу обязательно выложу исходники)Надеюсь кому-то пригодятся)
  5. Большое спасибо за быстрый и грамотный ответ!) "Картинку в картинке" вечером обязательно изучу, думаю это то что надо)Попиксельная обработка мне нужна для того чтобы реализовать распознавание символов, распознавание решил сделать на основе нейронной сети обратного распространения ошибки т.к. есть небольшой опыт работы с ней.... Может быть есть какие-то способы попроще организовать распознавание, средствами OpenCV ??? Использование нескольких способов распознавания мне не повредит)
×