Снег Север,ППКС.
Максимум, что стоит сделать это выкинуть окошко скачивания дополнений, да и то не везде. По большей степени потому что у человека может стоять ограничение трафика.
Модератор: Модераторы
Лекс Айрин писал(а):olegy123, тебя путает совпадение названий. На самом деле, переменную path уже давно можно было похоронить... просто делать это всем лень -- это же думать надо... проще перекрасить пару окошек. Тем более, что в винде все регистрируется в реестре. Да и вообще, в самой процедуре поиска библиотек есть большой глюк -- нельзя, по умолчанию, искать в подпапках установленной программы. И, видимо, он остался еще с самого начала. Поэтому и приходится извращаться с задаваемыми пользователем путями.
Снег Север писал(а):Лекс Айрин, вы упорно путаете библиотеки и СОМ-объекты. Не знаю как в линуксах, но в винде это - совершенно разные сущности. Регистрируются СОМ-объекты (которые тоже библиотеки, но специфические), а обычные библиотеки нигде не регистрируются. Просто есть предопределенные правила их поиска при отсутствии полного пути в вызове - папка с вызывающей программой, папка windows, папка system. У меня бывает с полдесятка разных версий библиотек с одинаковыми названиями, но ни малейшей путаницы не происходит.
Вообще то DOS - это дисковая операционная система, где на дисках есть файлы - с ними нужно было работать через файловую систему.. До них были перфокарты, tap-ленты.Alex2013 писал(а): Дос пошол от CP/M https://ru.wikipedia.org/wiki/CP/M (и кстати диски по алфавиту от туда же )
Снег Север писал(а):Правильно - держать библиотеки в каталоге с экзешником. И не волноваться про любые иные их версии в других местах.Лекс Айрин писал(а):Конечно, проще закинуть ее в папку system, но это не всегда удобно и правильно.
olegy123 писал(а):Лекс, напиши в MS - что мол это святотатство использовать $Path как системную переменную..
olegy123 писал(а):В линуксах там анархия, для COM нужен некий реестр, но его никто не может сделать, там systemd все еще идут баталии об нужности.
olegy123 писал(а): .NET Framework за собой не имеет смысла тянуть вслед за программой в 3Mb.
olegy123 писал(а):Вообще то DOS - это дисковая операционная система, где на дисках есть файлы - с ними нужно было работать через файловую систему.. До них были перфокарты, tap-ленты.
Такие специфичные вещи, как рантаймы, которые идут только от единственного производителя (можно еще Java вспомнить) - это исключения, которые только подтверждают правило. И там, как раз, никаких конфликтов версий не бывает.olegy123 писал(а):не всегда удобно.. .NET Framework за собой не имеет смысла тянуть вслед за программой в 3Mb.
Лекс Айрин писал(а):olegy123 писал(а):Лекс, напиши в MS - что мол это святотатство использовать $Path как системную переменную..
Ну почему, не стоит так к этому серьезно относиться.
Файловая система, где доступ к данным, в том числе и к dll, осуществляется через путь.Лекс Айрин писал(а):1) любая ось сейчас использует диски, так что акцент на этом,теряет смысл.
olegy123 писал(а):Файловая система, где доступ к данным, в том числе и к dll, осуществляется через путь.
Alex2013 писал(а):Разыскиваются проекты с ОpenCV на паскале .
olegy123 писал(а):Есть книжки, в том числе и на русском OpenCV.
olegy123 писал(а): а fpc - скорее будешь первопроходцем.
Alex2013 писал(а):Уже не буду ... там какой-то грек по суетился ...
olegy123 писал(а):у тебя задача очень специфическая, так что не жди прямых ответов, даже на форумах.
проще разобраться как получить нужные данные, какие манипуляции нужно сделать сначала "на бумаге".
OpenCV - это всего лишь набор инструментов. нужно изучить команды.
тогда будет понятно, как решили аналогичные задачи на других языках программирования - команды везде одинаковые..
Добавлено спустя 1 минуту 26 секунд:Alex2013 писал(а):Уже не буду ... там какой-то грек по суетился ...
грек перевел .h в pas.
Демо-версия FrameRecon - это программа Delphi 6, которая отслеживает в реальном времени черный квадрат в изображении веб-камеры.
Программа находит кадр, используя контуры, либо на основе Canny, либо пороговой функции. В дереве различных контуров он ищет четыре угловых, выбирая только один внутренний четырехугольный контур. Для них вычисляется простое правило выравнивания для поиска искомого квадратного кадра. Затем он вычисляет перспективное преобразование (перевод и вращение), вытягивает полученный вычисляемый кадр в зеленый цвет и искажает изображение, поскольку кадр был только перед объективом без перевода или вращения.
type
TCvPointArray = array [0 .. 100] of CvPoint;
pCvPointArray = ^TCvPointArray;
Var B:TBitmap; //Основной рабочий Bitmap
cs: CvSize; S:String;
src: pIplImage = Nil;
dst: pIplImage = Nil;
contours: pCvSeq = nil;
storage: pCvMemStorage;
i: Integer;
lines: pCvSeq;
line: pCvPointArray;
cvCP:cvPoint;
const frame: PIplImage=nil ;
BO:TBitmap=nil;
....
Begin
....
// Подключение Опен ЦВ
Cs.width:=b.Width;
Cs.height:=b.Height;
if Frame = nil then Frame:= cvCreateImage( cs, 8, 3 );
Move(b.RawImage.Data^,Frame.ImageData^, Frame.ImageSize);
...
// хранилище памяти для хранения найденных линий
storage := cvCreateMemStorage(0);
lines := nil;
i := 0;
dst := cvCreateImage(cvGetSize(Frame), 8, 1)
SRC := cvCreateImage(cvGetSize(Frame), 8, 1);
cvCvtColor(Frame,SRC,CV_BGR2GRAY);// "Серое небо потухшие птицы ... " :)
cvCp.x:=0;cvCp.y:=0;
//cvThreshold(SRC, DST, 128, 255, CV_THRESH_BINARY_INV); // Тут что-то не то ...//CvCopy( DST,SRC,0);
// нахождение контуров
cvFindContours(SRC, storage, @contours, SizeOf(CvContour), CV_RETR_LIST,
CV_CHAIN_APPROX_SIMPLE, cvCP);
// прорисовка контуров
cvDrawContours(Frame, contours, CV_RGB(100, 200, 0),
CV_RGB(200, 100, 0),1,1 , CV_AA
, cvCP);
// нахождение линий
lines := cvHoughLines2(SRC, storage, CV_HOUGH_PROBABILISTIC
, 1,PI / 180, 50, 50,10 );
// нарисуем найденные линии
for i := 0 to lines^.total - 1 do
begin
line := PCvPointArray ( cvGetSeqElem(lines, i));
cvLine(Frame, line^[0], line^[1], CV_RGB(255, 0, 0)//, 1, CV_AA, 0 );
end;
cvReleaseMemStorage(storage);
cvReleaseImage(src);
cvReleaseImage(dst);
IplImage2Bitmap(frame,b);
....
Procedure OpenCV_ARTest(Var src: pIplImage);
function CvSize(const width, height: Integer): TCvSize;
begin
Result.width := width;
Result.height := height;
end;
function CvTermCriteria(_type: Integer; max_iter: Integer; epsilon: Double): TCvTermCriteria;
begin
Result.type_ := _type;
Result.maxIter := max_iter;
Result.epsilon := epsilon;
end;
type
TCvPointArray = array [0 .. 100] of CvPoint;
pCvPointArray = ^TCvPointArray;
pCvPoint2D32f = ^TCvPoint2D32f;
(* TCvPoint2D32f = record
x: Single;
y: Single;
{$IFDEF DELPHIXE2_UP}
class operator Subtract(a, b: TCvPoint2D32f): TCvPoint2D32f; // Subtraction of type TCvPoint2D32f
function Norm: Single;
function cvPoint: TCvPoint;
{$ENDIF}
end;
}*)
Type Tcorners=Array[0..1] of pCvPoint2D32f;
const
// Print pattern "chessboard 6x5.jpg"
// trailer_filename = 'trailer.avi';
pic_filename = 'pic.jpg';
Var
capture: pCvCapture = nil;
image: pIplImage = nil;
frame: pIplImage = nil;
neg_img, cpy_img: pIplImage;
key: Integer = 0;
fcount: Integer = 0;
option: Integer = 0;
vid: pCvCapture = nil;
pic: pIplImage;
b_width: Integer = 5;
b_height: Integer = 4;
b_squares: Integer = 20;
b_size: TCvSize;
warp_matrix: pCvMat=Nil;
corners:pCvPoint2D32f {^ Tcorners} =Nil;
corner_count: Integer;
gray: pIplImage;
found: Integer;
p: array [0 .. 3] of TCvPoint2D32f;
q: array [0 .. 3] of TCvPoint2D32f;
blank: pIplImage;
pp: array [0 .. 3] of CvPoint;
begin
image:=src;
pic := cvLoadImage(pic_filename);
//cvFlip(pic, pic, 1);
b_size.width := b_width;
b_size.height :=b_height;
if warp_matrix=Nil then
warp_matrix := cvCreateMat(3, 3, CV_32FC1);
if corners=Nil then
corners := AllocMem(b_squares * SizeOf(TCvPoint2D32f));
//cvFlip(image, image, 1);
cpy_img := cvCreateImage(cvGetSize(image), 8, 3);
neg_img := cvCreateImage(cvGetSize(image), 8, 3);
gray := cvCreateImage(cvGetSize(image), image^.depth, 1);
found := cvFindChessboardCorners (image, b_size, PCvPoint2D32f(corners), @corner_count,
CV_CALIB_CB_ADAPTIVE_THRESH or CV_CALIB_CB_FILTER_QUADS);
cvCvtColor(image, gray, CV_BGR2GRAY);
// This function identifies the pattern from the gray image, saves the valid group of corners
cvFindCornerSubPix(gray, PCvPoint2D32f(corners), corner_count, cvSize(11, 11), cvSize(-1, -1),
cvTermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER , 30, 0.1));
if (corner_count = b_squares) then
begin
blank := cvCreateImage(cvGetSize(pic), 8, 3);
// CvCopy(image,blank,nil);
cvZero(blank);
cvNot(blank, blank);
// Set of source points to calculate Perspective matrix
q[0].x := pic^.width * 0;
q[0].y := pic^.height * 0;
q[1].x := pic^.width;
q[1].y := pic^.height * 0;
q[2].x := pic^.width;
q[2].y := pic^.height;
q[3].x := pic^.width * 0;
q[3].y := pic^.height;
// Set of destination points to calculate Perspective matrix
p[0].x := corners[0].x;
p[0].y := corners[0].y;
p[1].x := corners[4].x;
p[1].y := corners[4].y;
p[2].x := corners[19].x;
p[2].y := corners[19].y;
p[3].x := corners[15].x;
p[3].y := corners[15].y;
// Calculate Perspective matrix
cvGetPerspectiveTransform(@q, @p, warp_matrix);
// Boolean juggle to obtain 2D-Augmentation
cvZero(neg_img);
cvZero(cpy_img);
cvWarpPerspective(pic, neg_img, warp_matrix,
//CV_INER_LINEAR + CV_WARP_FILL_OUTLIERS
9, cvScalarAll(0));
cvWarpPerspective(blank, cpy_img, warp_matrix,
//CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS
9, cvScalarAll(0));
cvNot(cpy_img, cpy_img);
cvAnd(cpy_img, image, cpy_img, nil);
cvOr(image, neg_img, image, nil);
cvFlip(gray, gray);
cvReleaseImage(blank);
end ;
//---------------------------------
cvReleaseImage(cpy_img);
cvReleaseImage(neg_img);
cvReleaseImage(gray);
//------------------------
end;
Сейчас этот форум просматривают: Yandex [Bot] и гости: 2