RinOS
Пользователи-
Количество публикаций
99 -
Зарегистрирован
-
Посещение
-
Days Won
8
Все публикации пользователя RinOS
-
Это плохо(( К примеру о каких объектах идет речь? К примеру возьмем функцию cvCanny, десяток потоков вызывают эту функцию, со своими данными (одновременно). Будут ли тут какие нибудь траблы? У меня в ПО архитектура такая: Есть программа в ней N потоков, в цикле обращаются к DLL, и вызывают функцию. Вот схема: Если что то не понятно, поясню! Так вот, когда вызыватся process через некоторе время сыпяться ексепшены из cxcore.dll (( Если расставить критические секции перед вызовом process(), то все нормально, но тк эта функция выполняется некотое время, другие потоки ждут, и получается не многопоточность, а последовательно... имхо
-
ух.... я не думал что этот кошмар закончиться... MSVCRT8.0 помог... после перезагрузки)) Спасибо огромное)
-
OpenCV конечно не установлен... Предполагаю таскать с программой 2-3 dll-ки... Но ни как не 20 метров... (( MSVCRT8.0 ставил, не помогло.
-
Сначала требовал bpl-ки и dll-ки. Все нашел и положил в папку с программой. После этого уже не ругался на dll/bpl. а просто выдает 2 раза и вылетает Cfr не разжигай религиозные войны)
-
Ни как не могу запустить программу на другом компьютере где нет среды Builder С++. Что только не делал... Смотрел чего не хватает через Dependency Walker все dll на месте, И копировал все bpl, и компилировал без run time pakage. Ни как не хочет запускаться (( Что делать?
-
Поясни! Каким образом?
-
Не поможет, тк в этом случае лишь градиент короче, а 2 движущихся объекта с примерно одинаковой скоростью, так и будут казаться одним целым... тут нужно другое решение... только вот какое?
-
IplImage To Bitmap; Переделал функцию рисования IplImage для Delphi. Пользуйтесь )) function WidthBytes(bits: Integer): Integer; begin Result := Trunc((bits + 31) / 32) * 4; end; function CreateRGBBitmap(Ipl: PIplImage): HBITMAP; var i, j: Integer; LApp: PChar; LBitInfo: TBitmapInfo; begin LBitInfo.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER); LBitInfo.bmiHeader.biWidth := Ipl.width; LBitInfo.bmiHeader.biHeight := Ipl.height; LBitInfo.bmiHeader.biPlanes := 1; LBitInfo.bmiHeader.biBitCount := 24; LBitInfo.bmiHeader.biCompression := BI_RGB; LBitInfo.bmiHeader.biSizeImage := WidthBytes(Ipl.width * 8) * Ipl.height; LBitInfo.bmiHeader.biXPelsPerMeter := 0; LBitInfo.bmiHeader.biYPelsPerMeter := 0; LBitInfo.bmiHeader.biClrUsed := 0; LBitInfo.bmiHeader.biClrImportant := 0; Result := CreateDIBSection(0, LBitInfo, DIB_RGB_COLORS, Pointer(LApp), 0, 0); if(Ipl.nChannels = 1) then for i := 0 to Ipl.height - 1 do for j := 0 to Ipl.width - 1 do begin LApp[Ipl.width*3*(Ipl.height-i-1)+j*3] := Ipl.imageData[Ipl.width*(i)+j]; LApp[Ipl.width*3*(Ipl.height-i-1)+j*3+1] := Ipl.imageData[Ipl.width*(i)+j]; LApp[Ipl.width*3*(Ipl.height-i-1)+j*3+2] := Ipl.imageData[Ipl.width*(i)+j]; end; if Ipl.nChannels = 3 then for i := 0 to Ipl.height - 1 do Move(Pointer(Ipl.imageData+Ipl.width*3*i)^, Pointer(LApp+Ipl.width*3*(Ipl.height-i-1))^, Ipl.width*3); end; procedure APIDrawIpl(X, Y: Integer; Handle: THandle; Ipl: PIplImage); var LMemDC, LHDC: HDC; LBitmap: HBITMAP; begin LHDC := GetDC(Handle); LMemDC := CreateCompatibleDC(LHDC); LBitmap := CreateRGBBitmap(Ipl); SelectObject(LMemDC, LBitmap); BitBlt(LHDC, X, Y, Ipl.width, Ipl.height, LMemDC, 0, 0, SRCCOPY); DeleteObject(LBitmap); DeleteDC(LMemDC); DeleteDC(LHDC); end;
-
В общем есть проблемка... Предположим 2 объекта движутся друг за другом, но шаблоны движения распознают их как один движущийся объект, а это не есть гуд (( Для наглядности см анимацию: Как сделать так что бы, различичать что это не 1 объект движется, а 2?
-
В книге написано что "распознование" Y, делается с помощью моментов (CvMoments), только к сожалению, я не понял тему про моменты, что это такое и с чем его едят( Если кто то напишет хоть маленький либез по ним буду очень благодарен.
-
Как я отписался в другом топике Кальман не подходит) тк для того что бы запустить предсказание нужно знать уже где будет объект в следующем кадре, а это и есть задача...
-
За пример спасибо) С помощью него я понял что не могу использовать фильтр Кальмана в моём случае( Моя цель была найти объект в следующем кадре... Но что бы передать фильтру Кальмана predictionUpdate() надо знать где этот объект находиться...
-
Эх)) пример и в правду есть... Я даже его видел раньше, только не понял... там какая то змейка по кругу движется)) За доки спасибо) почитаю) Скорее многомерный)
-
Фильтр Калмана должен вычисляется для каждого объекта предыдущем шаге, чтобы спрогнозировать его местоположение в следующем шаге? Правильно я понял? В OpenCV я так думаю нет такой функции?
-
Что нам даст запись по x, y? По моему это не вариант... К примеру на рисунке 2 объекта, или более, взяли мы первые 4 кадра и обработали как нам узнать где на следующих 4 кадрах, находится каждый из этих объектов. По просту говоря нужно составить массив CvRect для каждого объекта, это и будет его путь.
-
Спасибо)) Классный пример! Возник вопрос... Эта программа после обработки каждых 4 кадров, возвращает нам CvRect, Есть ли какой ни будь достаточно простой способ, узнать всю траеткторию движения объекта? То есть проследить его путь.
-
хм... что то не понял( видимо этот код подходит для CvRect, но у CvBox2D немного другая структура... Я так понимаю что x,y задают центр прямугольника, а не верхний левый угол. В общем вот функция, может кому тоже пригодится void PaintBox2D(IplImage* img, CvBox2D box, CvScalar color, int thickness CV_DEFAULT(1), int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0)) { CvPoint2D32f box_vtx[4]; cvBoxPoints(box, box_vtx); CvPoint pt0, pt; pt0.x = cvRound(box_vtx[3].x); pt0.y = cvRound(box_vtx[3].y); for(int i = 0; i < 4; i++ ) { pt.x = cvRound(box_vtx.x); pt.y = cvRound(box_vtx.y); cvLine(img, pt0, pt, color, thickness, line_type, shift); pt0 = pt; } }
-
Да структура) Она представляет собой прямоугольник, повернутый на определенный угол. Вот этот прямоугольник и нужно как то нарисовать..
-
Так вроде я и работаю с HSV, входящее изображение RGB сразу и преобразовываю... cvCvtColor(src, hsv, CV_BGR2HSV);
-
Всем привет! В общем написал код для сравнения гистограмм изображений: IplImage* hist2image(IplImage *src, int h_bins = 100, int s_bins = 100, int scale = 5) { IplImage *hsv = cvCreateImage(cvSize(src->width, src->height), 8, 3); IplImage *h = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage *s = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage *v = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage* planes[] = {h, s}; int hist_size[] = {h_bins, s_bins}; float h_ranges[] = {0, 180}; float s_ranges[] = {0, 255}; float* ranges[] = {h_ranges, s_ranges}; cvCvtColor(src, hsv, CV_BGR2HSV); cvCvtPixToPlane(hsv, h, s, v, NULL); CvHistogram* hist; hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1); cvNormalizeHist(hist, 1.0); cvCalcHist(planes, hist, 0, 0); IplImage* hist_img = cvCreateImage(cvSize(h_bins*scale, s_bins*scale),8,3); cvZero( hist_img ); float max_value = 0; cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0); for(int h = 0; h < h_bins; h++) { for(int s = 0; s < s_bins; s++ ) { float bin_val = cvQueryHistValue_2D( hist, h, s ); int intensity = cvRound( bin_val * 255 / (max_value+1) ); cvRectangle( hist_img, cvPoint(h*scale, s*scale), cvPoint((h+1)*scale - 1, (s+1)*scale - 1), CV_RGB(intensity,intensity,intensity), CV_FILLED); } } return hist_img; } CvHistogram* image2hist(IplImage *src) { IplImage *r1 = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage *g1 = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage *b1 = cvCreateImage(cvSize(src->width, src->height), 8, 1); IplImage* planes[] = {r1, g1, b1}; int hist_size[] = {200, 200}; float r_ranges[] = {0, 255}; float g_ranges[] = {0, 255}; float b_ranges[] = {0, 255}; float* ranges[] = {r_ranges, g_ranges, b_ranges}; CvHistogram* hist; hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1); cvCalcHist(planes, hist, 0, 0); return hist; } ... cvNamedWindow("MyWnd", CV_WINDOW_AUTOSIZE); cvNamedWindow("MyWnd2", CV_WINDOW_AUTOSIZE); cvNamedWindow("histMyWnd", CV_WINDOW_AUTOSIZE); cvNamedWindow("histMyWnd2", CV_WINDOW_AUTOSIZE); IplImage *src1 = cvLoadImage("1.bmp"); IplImage *src2 = cvLoadImage("2.bmp"); CvHistogram* hist1 = image2hist(src1); CvHistogram* hist2 = image2hist(src2); cvNormalizeHist(hist1, 1.0); cvNormalizeHist(hist2, 1.0); IplImage *imagehist1 = hist2image(src1); IplImage *imagehist2 = hist2image(src2); double dl = cvCompareHist(hist1, hist2, CV_COMP_CORREL); cvShowImage("MyWnd", src1); cvShowImage("MyWnd2", src2); cvShowImage("histMyWnd", imagehist1); cvShowImage("histMyWnd2", imagehist2); cvWaitKey(0); ... Не знаю, правильно ли работает этот код... Прошу прокомментировать. И еще в книжке читал про cvCompareHist, там последний параметр, это методы сравнения: CV_COMP_CORREL, CV_COMP_CHISQR, CV_COMP_INTERSECT, CV_COMP_BHATTACHARYYA Я конечно с помощью переводчика попробывал перевести... но ни чего из этого не понял(( Может у кого есть на русском?
-
Не понимать ((, переводчик не помог. Скажите пожалуйста по русски.
-
Использование нейросетевой библиотеки FANN
RinOS replied to Smorodov's topic in Вопросы по нейросетям и ИИ
Что то для меня технология нейросетей вообще темный лес... Даже, Уоссермена-Нейрокомпьютерная техника, читал но это как информационный шум был, ни чего не понял. В особенности, как практически использовать... -
Здравствуйте! Есть такая структура: typedef struct CvCapture CvCapture; Ну совершенно не укладывающаяся в голове делфийца... как ее описать? Еще не нашел пару нужных функций, к примеру: cvCaptureFromFile. Перехожу по ней и вижу такое описание: ... #define cvCaptureFromFile cvCreateFileCapture #define cvCaptureFromCAM cvCreateCameraCapture #define cvCaptureFromAVI cvCaptureFromFile ... Подскажите плиз откуда их экспортировать?
-
А на сколько сложно загрузить видео из файла?