Nuzhny 243 Жалоба Опубликовано January 13, 2011 Да, если это не запрещено какими-нибудь внутренними правилами, то выложи здесь на форуме итоговый проект. Когда закончишь конечно. Хороший пример практического применения компьютерного зрения вместе с OpenCV. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано January 13, 2011 Smorodov, Nuzhny спасибо вам большое за помощь... Когда закончу проект /надеюсь Вы мне еще немного поможете / и разберусь со всеми "внутренними правилами" тогда здесь и опубликую. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано January 17, 2011 Здравствуйте, подскажите... каким способом можно выделить символы из изображения Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано January 17, 2011 Первая мысль - построение гистограммы: IplImage *img = cvLoadImage("f:\\74a72cd615f3.jpg", 0); cvErode(img, img, NULL, 1); cvDilate(img, img, NULL, 1); cvShowImage("img", img); std::vector<int> hist(img->width, 0); for (int y = 0; y < img->height; ++y) { unsigned char *pbuf = (unsigned char *)(img->imageData + y * img->widthStep); for (int x = 0; x < img->width; ++x) { if (*pbuf) ++hist[x]; ++pbuf; } } IplImage *img_hist = cvCreateImage(cvGetSize(img), 8, 1); cvSet(img_hist, cvScalar(0)); for (int i = 0; i < hist.size(); ++i) { cvRectangle(img_hist, cvPoint(i, 0), cvPoint(i, hist[i]), cvScalar(255)); } cvShowImage("img_hist", img_hist); for(; { if (cvWaitKey(10) > 0) break; } cvReleaseImage(&img_hist); cvReleaseImage(&img);[/code] Вторая - построение контуров: [code]IplImage *img = cvLoadImage("f:\\74a72cd615f3.jpg", 0); cvErode(img, img, NULL, 1); cvDilate(img, img, NULL, 2); cvShowImage("img", img); IplImage *img_cont = cvCreateImage(cvGetSize(img), 8, 1); cvSet(img_cont, cvScalar(0)); CvMemStorage *storage = cvCreateMemStorage(0); CvContourScanner cs = cvStartFindContours(img, storage, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE); CvSeq *mContour = 0; for (CvSeq *contour = cvFindNextContour(cs); contour; contour = cvFindNextContour(cs)) { if (contour->total >= 6) { CvBox2D box = cvFitEllipse2(contour); CvPoint center = cvPointFrom32f(box.center); CvSize size = cvSize(cvRound(box.size.width * 0.5), cvRound(box.size.height * 0.5)); cvEllipse(img_cont, center, size, -box.angle, 0, 360, CV_RGB(0, 0, 255), 1, CV_AA, 0); } } cvEndFindContours(&cs); cvReleaseMemStorage(&storage); cvShowImage("img_cont", img_cont); for(; { if (cvWaitKey(10) > 0) break; } cvReleaseImage(&img_cont); cvReleaseImage(&img); А вообще - надо подумать. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fresh 0 Жалоба Опубликовано January 23, 2011 Здравствуйте. Подскажите идею как проделать следующее: Имею изображение: И шаблоны /например такие/: Сравниваю их с помощью cvMathTemplate: IplImage *ImgFromFile = 0; IplImage *BgImage = ruchnoy_povorot; ImgFromFile = cvLoadImage( "D:/Projects/testiq/Debug/symbol/2.bmp" ,CV_LOAD_IMAGE_GRAYSCALE); int iwidth = BgImage->width - ImgFromFile->width + 1; int iheight = BgImage->height - ImgFromFile->height + 1; IplImage *ResImage = cvCreateImage( cvSize(iwidth,iheight),IPL_DEPTH_32F, 1); IplImage *ResImageMin = cvCreateImage( cvSize(iwidth,iheight),IPL_DEPTH_32F, 1); cvMatchTemplate( BgImage, ImgFromFile, ResImage, CV_TM_CCOEFF_NORMED);//max cvMatchTemplate( BgImage, ImgFromFile, ResImageMin, CV_TM_SQDIFF_NORMED);//min double mm,MM; cvMinMaxLoc(ResImage, NULL, &MM, NULL, NULL); cvMinMaxLoc(ResImageMin, &mm, NULL, NULL, NULL); printf("MAX[best=1]=%f\nMIN[best=0]=%f\n",MM,mm); Проблема в следующем. Как организовать цикл для загрузки нового шаблона ... ImgFromFile = cvLoadImage( "D:/Projects/testiq/Debug/symbol/2.bmp" ,CV_LOAD_IMAGE_GRAYSCALE);/* нужно 3.bmp, затем 4.bmp .... n.bmp*/ путь "D:/Projects/testiq/Debug/symbol/2.bmp" это const char*. Вроде нельзя изменить /новичек в C++/... Как быть? Может есть другой вариант.. Заранее спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 23, 2011 Можно менять название файла, но наверное лучше будет делать как в играх. Грузят изображение со всеми буквами и ROI передвигают с буквы на букву. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано January 23, 2011 Можно сделать массив на указатели с картинками IplImage и при старте программы их загрузить. Твой код выделить в функцию, в которую параметром передавать IplImage - элемент массива. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах