nagoHok
-
Количество публикаций
54 -
Зарегистрирован
-
Посещение
-
Days Won
1
Сообщения, опубликованные пользователем nagoHok
-
-
вот это надо сглаживать и брать производную.
Спасибо большое!
-
Добавил сглаживание, не скажу что уж очень сгладилось но больших пиков уже нет
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { cvNamedWindow("Org"); cvNamedWindow("Gray"); IplImage* frame = NULL; frame = cvLoadImage("c:/test.jpg"); IplImage* gray = NULL; gray = cvCreateImage(cvGetSize(frame), 8, 1); cvConvertImage(frame, gray, CV_BGR2GRAY); CvPoint ptLast = cvPoint(0, 0); DWORD dwStart = GetTickCount(); int nLastYPos = 0; for (int nY = 0; nY < gray->height; nY+=10) { ptLast = cvPoint(0, nY); for (int nX = 2; nX < gray->widthStep - 2; nX++) { int nAv = 0; for (int nPos = -2; nPos < 3; nPos++) { nAv += gray->imageData[nY * gray->widthStep + nX + nPos]; } nAv = abs(nAv); nAv /= 50; //int nBr1 = gray->imageData[nY * gray->widthStep + nX + 1] / 10; //nBr = abs(nBr1 - nBr); cvLine(frame, ptLast, cvPoint(nX, nY - nAv) , cvScalar(0), 1); ptLast = cvPoint(nX, nY - nAv); } } dwStart = GetTickCount() - dwStart; std::cout << dwStart; cvShowImage("Gray", gray); cvShowImage("Org", frame); cvReleaseImage(&gray); cvReleaseImage(&frame); gray = NULL; frame = NULL; char c = cvWaitKey(0); if (c == 27) { return 0; } return 0; }
-
оп, необновил страничку помоему Smorodov как раз на это ссылку дал.
-
А подойдет ли следующие сглаживание:
к примеру беру пять точек и высчитываю среднее значение между ними?
т.е.
-2 -1 0 1 2, и ставлю полученнное значение на место 0-го элемента?
-
Спасибо, буду изучать вопрос.
-
Итак перерыв форум, наткнулся на ссылочку http://www.inf.tsu.ru/library/DiplomaWorks/CompScience/2006/busigin/diplom.pdf
Очень понравился алгоритм про сканирование изображения в горизонтальном сечении и построения графика амплитуды яркости от координат.
Единственное на чем встал это на предложеной функции в разделе 3,3 на 21 странице, ни как не получается получить похожий график, к томуже далее предлагается получить производные от этой функции, но так как вуз мною закончен более 10 лет назад, вся основа вышки благополучно забыта.
Если кто силен в математике, подскажите что делать.
Спасибо за рание.
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { cvNamedWindow("Org"); cvNamedWindow("Gray"); IplImage* frame = NULL; frame = cvLoadImage("c:/O807MK177.jpg"); IplImage* gray = NULL; gray = cvCreateImage(cvGetSize(frame), 8, 1); cvConvertImage(frame, gray, CV_BGR2GRAY); CvPoint ptLast = cvPoint(0, 0); DWORD dwStart = GetTickCount(); int nLastYPos = 0; for (int nY = 0; nY < gray->height; nY+=10) { ptLast = cvPoint(0, nY); for (int nX = 0; nX < gray->widthStep - 2; nX++) { int nBr = gray->imageData[nY * gray->widthStep + nX] / 10; int nBr1 = gray->imageData[nY * gray->widthStep + nX + 1] / 10; nBr = abs(nBr1 - nBr); cvLine(frame, ptLast, cvPoint(nX, nY - nBr) , cvScalar(0), 1); ptLast = cvPoint(nX, nY - nBr); } } dwStart = GetTickCount() - dwStart; std::cout << dwStart; cvShowImage("Gray", gray); cvShowImage("Org", frame); cvReleaseImage(&gray); cvReleaseImage(&frame); gray = NULL; frame = NULL; char c = cvWaitKey(0); if (c == 27) { return 0; } return 0; }
-
Не странно.
CV_8UC1 тип это не double и не float, а указатель разыменован, вот и получается чепуха. Там должен стоять CV_64FC1
спасибо но не помогло )
-
как ни странно но после свертки все равно белый квадрат
double arKernel[9] = {0.1111, -0.8889, 0.1111, -0.8889, 4.1111, -0.8889, 0.1111, -0.8889, 0.1111}; CvMat mat = cvMat(3, 3, CV_8UC1, &arKernel); cvFilter2D(src, dst, &mat, cvPoint(-1,-1));
-
Здесь похоже имеется ввиду, что обработка этим фильтром = лаплассиан изображения + само изображение. Фильтр не должен выдавать значения больше диапазона значений изображения, т.к. сумма элементов матрицы равна 0.999. Так что изображение будет на 0.1% темнее исходного.
т.е. суммировать свернутое и исходное изображение всетаки надо?
-
1. Ммм, а зачем суммировать?
2. Почему размер ядра фильтра (double arKernel[25]) 25, а не 9?
Опа, действительно мой косяк на счет размерности.
Просто понял фразу
Фильтрация лапласианом и сложение с исходным эквивалентно фильтрации фильтром:
0.1111 -0.8889 0.1111
-0.8889 4.1111 -0.8889
0.1111 -0.8889 0.1111
Всё, что выходит за пределы диапазона, обрезается.
то что надо просуммировать исходное изображение с фильтрованным.
Т.е. наложить данный фильтр это и есть увеличение резкости или же как говорит Smorodov не все так просто в этом вопросе?
-
Как ни странно но результат это белый квадрат.
-
Здесь посмотри пост f.kirill, примеры работы, приводимого им фильтра.
я правильно понимаю что сначало мы делаем свертку с маской
0.1111 -0.8889 0.1111
-0.8889 4.1111 -0.8889
0.1111 -0.8889 0.1111
затем полученный результат суммируем с исходным изображением?
double arKernel[25] = {0.1111, -0.8889, 0.1111, -0.8889, 4.1111, -0.8889, 0.1111, -0.8889, 0.1111}; CvMat mat = cvMat(3, 3, CV_8UC1, arKernel); cvFilter2D(src, dst, &mat, cvPoint(-1,-1)); cvAdd(src, dst, dst);
-
А можно по конкретнее как увеличить резкость?
-
Очень заинтересовался проектом, точнее вплотную принялся за подобную разработку.
Код выложенный anton - м действительно очень тормозной, и не всегда коректно находит прямоугольники. Утечка памяти изза того что не чистит MemStorage.
Перерыл море инфы на ткнулся вот на подобный алгоритм http://cms.tusur.ru/filearchive/reports-magazine/2008-2-1/34-39.pdf
заключается он в разбиение изображения на блоки и составления карты контрастности
Кто что может сказать про данный метод?
-
а возможно ли отсканировать 9 главу?
Глава 9. Методы выделения и распознавания номерных знаков.
-
кто может описать процесс установки для 2008 студии?
Если кто ставил будьте добры, а то реально самому разбираться времени просто нету(
Благодарю за рание!
-
-
Реализовал при помощи openCv и обычными средствами без применения каких либо библиотек, если кому интересно могу выложить проект
-
Аналогичная ситуацию, всегда падает на cvCvtColor(pImage, pGray, CV_BGR2GRAY);
Счем это может быть связанно?
-
Огромное спасибо!
-
Всем привет!
Незнаю с чего начать,
Каким образом, точнее какими алгоритмы в библиотеке лучше пользоваться для локализации штрих-кода?
Спасибо за рание.
-
Может кому то и пригодиться
__forceinline int GetBit(const BYTE &btByte, const UINT &nBit) { BYTE btMask = 1 << nBit; BYTE btR = btMask & btByte; if(btR) return 1; return 0; } IplImage* LoadImage(const CString& strPathName) { Bitmap* pBitmap = NULL; IplImage* pImage = NULL; pBitmap = new Bitmap(strPathName); if(!pBitmap) return NULL; if(pBitmap->GetLastStatus() != Ok) { delete pBitmap; return NULL; } if(pBitmap->GetPixelFormat() != PixelFormat1bppIndexed) { delete pBitmap; CStringA strPathNameA(strPathName); pImage = cvLoadImage(strPathNameA); return pImage; } BitmapData *pSrcData = new BitmapData; SecureZeroMemory(pSrcData, sizeof(BitmapData)); if(pBitmap->LockBits(&Rect(0,0, pBitmap->GetWidth(), pBitmap->GetHeight()), ImageLockModeRead , pBitmap->GetPixelFormat(), pSrcData) != Ok) { delete pBitmap; delete pSrcData; return NULL; } pImage = cvCreateImage(cvSize(pSrcData->Width, pSrcData->Height), IPL_DEPTH_8U, 1); if(!pImage) { delete pBitmap; delete pSrcData; return NULL; } int nSize = 0; int nStride = abs(pSrcData->Stride); BYTE* pSrcPixels = (BYTE*)pSrcData->Scan0; for (UINT nY = 0; nY < pSrcData->Height; nY++) { int nOffset = 0; for (int nX = 0; nX < nStride; nX++) { BYTE bt8Bit = pSrcPixels[nX + nY * nStride]; for (int nBit = 7; nBit > -1; nBit--) { nSize = nX + nY * pImage->widthStep + nOffset; if(nSize > pImage->imageSize) break; int nBW = 0; if(GetBit(bt8Bit, nBit)) nBW = 255; pImage->imageData[nSize] = nBW; nOffset++; } nOffset--; } } delete pBitmap; delete pSrcData; return pImage; }
-
Спасибо буду пробовать!
-
Nuzhny
понятно, ну скажем я самостоятельно конвертну в удобный вид для библиотеки изображение, а как тогда создать IplImage и поместить в него масив данных?
Распознавание номерного знака, расп. текста.
в OpenCV
Опубликовано · Report reply
Так если я правильно понял то float x - это позиция пикселя?
тогда скажем для конечнего пикселя к примеру 640-го будет произведено 638 итераций?