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

Чтение маркировки шестерни

Recommended Posts

Да, если это не запрещено какими-нибудь внутренними правилами, то выложи здесь на форуме итоговый проект. Когда закончишь конечно. Хороший пример практического применения компьютерного зрения вместе с OpenCV.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, Nuzhny спасибо вам большое за помощь...

Когда закончу проект /надеюсь Вы мне еще немного поможете ;) / и разберусь со всеми "внутренними правилами" тогда здесь и опубликую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

74a72cd615f3.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Первая мысль - построение гистограммы:

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);

А вообще - надо подумать.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте.

Подскажите идею как проделать следующее:

Имею изображение: f5a28fdff4e2.jpg

И шаблоны /например такие/: 9ba7755972aa.jpg 69c1cdd7b98a.jpg 76d1fc6f7117.jpg

Сравниваю их с помощью 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++/...

Как быть? Может есть другой вариант.. Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Грузят изображение со всеми буквами и ROI передвигают с буквы на букву.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно сделать массив на указатели с картинками IplImage и при старте программы их загрузить. Твой код выделить в функцию, в которую параметром передавать IplImage - элемент массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×