1 (изменено: Malcev, 2023-03-12 05:53:46)

Тема: AHK: OpenCV определение лица

Тема для обсуждения "OpenCV определение лица".
http://forum.script-coding.com/viewtopic.php?id=17653

2

Re: AHK: OpenCV определение лица

А в чём вопрос-то?

3

Re: AHK: OpenCV определение лица

А вопросов пока нету,
На нашем форуме еще OpenCV не обсуждался, а возможности, как я понимаю, у него большие.
Можно тут пообсуждать, померить скорость, запостить заготовки-примеры, если у кого имеются.

4

Re: AHK: OpenCV определение лица

Malcev, а как мне запустить этот - приведенный вами скрипт ?

То есть нужна какая-то картинка с лицом, и скрипт что сделает ?
Определит координаты лица на фотографии ?

5

Re: AHK: OpenCV определение лица

Malcev, так....
Ну в общем - более менее запустил эту систему.
А вот там еще есть кроме указанных библиотек dll - еще и другие библиотеки.
Ну например - которые распознают объекты на видео.
(Наверное это библиотека: opencv_video2413.dll )

Вот как это реализовать в autohotkey ?

6

Re: AHK: OpenCV определение лица

Путин ВВ пишет:

там еще есть кроме указанных библиотек dll - еще и другие библиотеки.

Я подправил код в предыдущих постах для более удобной загрузки dll через массив.

Путин ВВ пишет:

как это реализовать в autohotkey ?

Нужно читать уроки и переносить их на автохотки.
Честно сказать интереса у меня в этом нет.
Вы можете сами попробовать.
Например чтобы показать видео на экране, читаем урок:
http://robocraft.ru/blog/computervision/270.html
Переносим на ахк:

capture := _cvCaptureFromFile(file)
loop
{
   frame := _cvQueryFrame(capture)
   if !frame
      break
   _cvShowImage(window, frame)
   sleep 33
}
msgbox done


_cvCaptureFromFile(filename)
{
   Result := DllCall(opencv.opencv_highgui "\cvCreateFileCapture", "AStr", filename, "Cdecl Ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvQueryFrame(capture)
{
   Result := DllCall(opencv.opencv_highgui "\cvQueryFrame", "Ptr", capture, "Cdecl Ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

Информация которая может вам пригодиться:
https://autohotkey.com/board/topic/6741 … g-etc-etc/
Ну и разумеется:
https://docs.opencv.org/2.4/

7

Re: AHK: OpenCV определение лица

Malcev, а в этом коде - куда добавлять название файла ?

Я вот так сделал - что-то не работает.

capture := _cvCaptureFromFile("1.mp4")
loop
{
   frame := _cvQueryFrame(capture)
   if !frame
      break
   _cvShowImage(window, frame)
   sleep 33
}
msgbox done


_cvCaptureFromFile(filename)
{
   Result := DllCall(opencv.opencv_highgui "\cvCreateFileCapture", "AStr", filename, "Cdecl Ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvQueryFrame(capture)
{
   Result := DllCall(opencv.opencv_highgui "\cvQueryFrame", "Ptr", capture, "Cdecl Ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

8

Re: AHK: OpenCV определение лица

А что пишет?

9

Re: AHK: OpenCV определение лица

Выдает вот такую ошибку:
https://c.radikal.ru/c39/1901/26/421a4e2dcf49.jpg

Может надо какую-то dll подключить (как в предыдущем примере с распознаванием лиц) ?

10

Re: AHK: OpenCV определение лица

Конечно надо.
И не какую-то, а для показа видео конкретно одну - opencv_highgui2413.dll.
Плюс еще надо функции с первого поста перенести + еще написать самому функцию для освобождения ресурсов.

        // освобождаем ресурсы
        cvReleaseCapture( &capture );

11 (изменено: Путин ВВ, 2019-01-11 16:34:50)

Re: AHK: OpenCV определение лица

Malcev, Я добавил все нужные файлы dll. Теперь скрипт выглядит так:

file := "1.mp4"

;start dll opencv
Global opencv := { opencv_core: "opencv_core2413.dll" 
, opencv_highgui: "opencv_highgui2413.dll"
, opencv_imgproc: "opencv_imgproc2413.dll"
, opencv_objdetect: "opencv_objdetect2413.dll" }
_OpenCV_Startup()


// освобождаем ресурсы
cvReleaseCapture(&capture);


capture := _cvCaptureFromFile(file)
loop
{
   frame := _cvQueryFrame(capture)
   if !frame
      break
   _cvShowImage(window, frame)
   sleep 33
}
msgbox done


_cvCaptureFromFile(filename)
{
   Result := DllCall(opencv.opencv_highgui "\cvCreateFileCapture", "AStr", filename, "Cdecl Ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvQueryFrame(capture)
{
   Result := DllCall(opencv.opencv_highgui "\cvQueryFrame", "Ptr", capture, "Cdecl Ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

Ругается на строчку :

cvReleaseCapture( &capture );

12

Re: AHK: OpenCV определение лица

Путин ВВ пишет:

Я добавил все нужные файлы dll

Нужный файл dll только один.
Зачем вы освобождаете ресурсы до того как успели их заполнить?
cvReleaseCapture( &capture ); - это на С.
Вам нужно перенести ее на ahk.
Для этого надо посмотреть в документации, к какой функции и к какой dll она обращается и вызвать ее на ahk через dllcall.

13

Re: AHK: OpenCV определение лица

Malcev, а в какой документации это смотреть ?
Где эта документация ?

14

Re: AHK: OpenCV определение лица

Поиском пользуетесь?

15

Re: AHK: OpenCV определение лица

Путин ВВ пишет:

Malcev, а в какой документации это смотреть ?
Где эта документация ?

Вы по ссылкам заходите, которые я вам постил?

Malcev пишет:

Информация которая может вам пригодиться:
https://autohotkey.com/board/topic/6741 … g-etc-etc/
Ну и разумеется:
https://docs.opencv.org/2.4/

16

Re: AHK: OpenCV определение лица

Malcev, да заходил.
Я просто там не особо понимаю где что.
Большое количество команд или библиотек связанных с видео.
Какая из них за что отвечает за простой вывод видео в интерфейс - непонятно.
(Эти команды же - в сокращенном виде написаны.)

17

Re: AHK: OpenCV определение лица

А вам для начала и не надо понимать. Например я тоже не понимаю.
Берете урок, смотрите какие команды там используются.
Вбиваете их в поиске на сайте opencv.
И дальше вызываете их через dllcall.
Если же для вас dllcall пока тёмный лес, то тогда читаете справку и пытаетесь понять как работают примеры приведенные в справке.

18

Re: AHK: OpenCV определение лица

Разобрался с запуском, лицо определяет. )
А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: OpenCV определение лица

А сможет машинка определить картинки, на которых текст?

20

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?

Потому что я переносил код с автоит, а он был написан под  2.4.5 dll.

DD пишет:

А сможет машинка определить картинки, на которых текст?

Уверен, что без проблем. Надо искать примеры на C и переводить их на ahk.

21

Re: AHK: OpenCV определение лица

Ты не пробовал перевести эту функцию.


Func _Opencv_IPL2BMP($pIplImage)
Local $tIplImage = DllStructCreate($tagIplImage, $pIplImage)
;Un-comment these lines of code if you want to see IplImage header information
;for $i = 1 to 22
; ConsoleWrite( $nIplImage[$i-1] & DllStructGetData($tIplImage,$i) & @CRLF)
;Next
$_aResult = DllCall($_opencvDll_1, "int:cdecl", "cvCreateImage", "int", DllStructGetData($tIplImage,'width'), "int", DllStructGetData($tIplImage,'height'), "int", 8, "int", 4 )
If @error Then ConsoleWrite("error5")

Local $pIplImagedst = $_aResult[0]
Local $tIplImagedst = DllStructCreate($tagIplImage, $pIplImagedst)

DllCall($_opencvDll_3, "none:cdecl", "cvCvtColor", "ptr", $pIplImage, "ptr", $pIplImagedst, "int", 0)
If @error Then ConsoleWrite("error6" & @error & @CRLF)

Local $dataptr= DllStructGetData($tIplImagedst,'imageData')
Local $hBMP = _WinAPI_CreateBitmap(DllStructGetData($tIplImagedst,'width'), DllStructGetData($tIplImagedst,'height'), 1, 32 , $dataptr)
;memory cleanup
$tIplImage = 0
$tIplImagedst = 0
$dataptr = 0
DllCall($_opencvDll_1, "none:cdecl", "cvReleaseImage", "ptr*", $pIplImagedst)
If @error Then ConsoleWrite("error7")
Return $hBMP
EndFunc ;==>_Opencv_GetWebCamFrame
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: OpenCV определение лица

Не,кроме тех двух больше не переводил.
А что ты хочешь сделать?

23

Re: AHK: OpenCV определение лица

Так ну первым делом картинку выводить в своё окно.
Можешь перевести на "русский":

$tIplImage = DllStructCreate($tagIplImage, $pIplImage)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: OpenCV определение лица

Выводить картинку - это так:

;// load IPL type image 
pimg := _cvLoadImage(file1)

;// Create some windows to show the input and output images in.
_cvNamedWindow(window)

;// show our input image
_cvShowImage(window, pimg)

DllStructCreate на автоит это VarSetCapacity на автохотки.

25

Re: AHK: OpenCV определение лица

Malcev пишет:

Выводить картинку - это так:

Это во всех примерах есть, я про своё окно, надо битмап получать.

Malcev пишет:

DllStructCreate на автоит это VarSetCapacity на автохотки.

Это тоже понял, не понимаю что передаётся в tagIplImage.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26 (изменено: Malcev, 2019-01-18 11:15:11)

Re: AHK: OpenCV определение лица

https://autoit-script.ru/autoit3_docs/f … Create.htm
В tagIplImage передается строка с членами структуры.
У автора библиотеки они прописаны все здесь: CVTag.au3.

Global $tagIplImage = _
    "int  nSize;" & _             ;/* sizeof(IplImage) */
    "int  ID;" & _             ;                /* version (=0)*/
    "int  nChannels;" & _             ;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    "int  alphaChannel;" & _             ;      /* Ignored by OpenCV */
    "int  depth;" & _             ;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    "byte colorModel[4];" & _             ;     /* Ignored by OpenCV */
    "byte channelSeq[4];" & _             ;     /* ditto */
    "int  dataOrder;" & _             ;         /* 0 - interleaved color channels, 1 - separate color channels.cvCreateImage can only create interleaved images */
    "int  origin;" & _             ;            /* 0 - top-left origin,1 - bottom-left origin (Windows bitmaps style).  */
    "int  align;" & _             ;             /* Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep instead.    */
    "int  width;" & _             ;             /* Image width in pixels.                           */
    "int  height;" & _             ;            /* Image height in pixels.                          */
    "ptr IplROI;" & _             ;    /* Image ROI. If NULL, the whole image is selected. */
    "ptr maskROI;" & _             ;      /* Must be NULL. */
    "ptr  imageId;" & _             ;                 /* "           " */
    "ptr tileInfo;" & _             ;  /* "           " */
    "int  imageSize;" & _             ;         /* Image data size in bytes (==image->height*image->widthStep in case of interleaved data)*/
    "ptr imageData;" & _             ;        /* Pointer to aligned image data.         */
    "int  widthStep;" & _             ;         /* Size of aligned image row in bytes.    */
    "int  BorderMode[4];" & _             ;     /* Ignored by OpenCV.                     */
    "int  BorderConst[4];" & _             ;    /* Ditto.                                 */
    "ptr imageDataOrigin;"             ;  /* Pointer to very origin of image data (not necessarily aligned) - needed for correct deallocation */

27 (изменено: serzh82saratov, 2019-01-18 11:27:15)

Re: AHK: OpenCV определение лица

Ок.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: OpenCV определение лица

DllStructGetData($tIplImagedst,'imageData')

Pointer [необязательный] Если структуре не выделена память, но используется указатель.

А тут что значит строка вторым параметром?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29 (изменено: serzh82saratov, 2019-01-18 11:32:08)

Re: AHK: OpenCV определение лица

DllStructCreate($tagIplImage, $pIplImage)

И тут я пропустил, она создаёт структуру из указателя на другую структуру?
Точнее пишет в неё.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30 (изменено: serzh82saratov, 2019-01-18 11:42:37)

Re: AHK: OpenCV определение лица

$tagIplImage получается не нужен, так как он требуется только для получения размеров, а у тебя есть _cvGetSize.

imageData - это смещение до указателя на данные
Но как в ней посчитать этот участок?

    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
// OpenCV2.0\include\opencv\cxtypes.h
typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /* Ignored by OpenCV */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /* Ignored by OpenCV */
    char channelSeq[4];     /* ditto */
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /* Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    */
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
    int  BorderConst[4];    /* Ditto.                                 */
    char *imageDataOrigin;  /* Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
IplImage;
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

И тут я пропустил, она создаёт структуру из указателя на другую структуру?

А я сам толком тонкостей не знаю.
Но как я понял на автоит нельзя напрямую получать данные из памяти из возвращаемой какой-либо функцией структуры.
Поэтому вначале передается структура через DllStructCreate, а потом уже используются  DllStructGetData и другие функции.

serzh82saratov пишет:

$tagIplImage получается не нужен, так как он требуется только для получения размеров, а у тебя есть _cvGetSize

А что именно ты хочешь сделать? Какой конкретно код перевести и для чего?

32

Re: AHK: OpenCV определение лица

    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */

Это всё ссылки - следовательно ptr.

33

Re: AHK: OpenCV определение лица

Malcev пишет:

Какой конкретно код перевести и для чего?

Этот например https://www.autoitscript.com/forum/topi … mory-leak/.

Malcev пишет:

А что именно ты хочешь сделать?

Вывести картинку в своё гуи.

Malcev пишет:

Но как я понял на автоит нельзя напрямую получать данные из памяти из возвращаемой какой-либо функцией структуры.
Поэтому вначале передается структура через DllStructCreate, а потом уже используются  DllStructGetData и другие функции.


$_aResult = DllCall($_opencvDll_1, "int:cdecl", "cvCreateImage", "int", DllStructGetData($tIplImage,'width'), "int", DllStructGetData($tIplImage,'height'), "int", 8, "int", 4 )
Local
 $pIplImagedst = $_aResult[0]
Local $tIplImagedst = DllStructCreate($tagIplImage, $pIplImagedst)
DllCall($_opencvDll_3, "none:cdecl", "cvCvtColor", "ptr", $pIplImage, "ptr", $pIplImagedst, "int", 0)

Тут как быть. Указатель на что в $_aResult[0] и что с ним делать перед передачей в cvCvtColor.

Это всё ссылки - следовательно ptr.

Структуру для х32 я посчитал как 88.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34

Re: AHK: OpenCV определение лица

https://autoit-script.ru/autoit3_docs/f … llCall.htm
dllcall возвращает массив.
aResult[0] - это то что возвращает сама dllcall на ahk.
Судя по всему она содержит структуру, которую потом надо передать через следующий вызов dllcall.
В автохотки с этим заморачиваться не надо, зато надо с подсчетом членов структуры и выравниванием их при передачи копии структуры.
В автоит есть функция для определения размера структуры:
https://www.autoitscript.com/autoit3/do … etSize.htm

35

Re: AHK: OpenCV определение лица

Local $pIplImagedst = $_aResult[0]
Local $tIplImagedst = DllStructCreate($tagIplImage, $pIplImagedst)
ToolTip(DllStructGetSize($tIplImagedst))

Вот так.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36

Re: AHK: OpenCV определение лица

Почему 112 а не 88 в х32. Похоже что ptr занимает 8 байт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37 (изменено: Malcev, 2019-01-18 12:45:12)

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

Похоже что ptr занимает 8 байт.

Не должно.

PTR 32 or 64bit pointer (depending on if the x86 or x64 version of AutoIt is used)

Наверное не так посчитал.

38 (изменено: serzh82saratov, 2019-01-18 14:14:21)

Re: AHK: OpenCV определение лица

"int  BorderMode[4];" & _  ;  /* Ignored by OpenCV.                  */
"int  BorderConst[4]

Опять я то что в квадратных скобках не умножил.

Malcev пишет:

aResult[0] - это то что возвращает сама dllcall на ahk.

cvCreateImage возвращает поинтер на структуру, и мы можем его передать в cvCvtColor, но перед этим надо что то сделать?
По этому адресу выделить память длинной 112.
Тут (в моём коде ниже) видно что заполнены только первые:

"int  nSize;" & _         ;  /* sizeof(IplImage) */
"int  ID;" & _           ;  /* version (=0)*/
"int  nChannels;" & _     ;  /* Most of OpenCV functions support 1,2,3 or 4 channels */
"int  alphaChannel;" & _   ;  /* Ignored by OpenCV */
"int  depth;" & 

дальше нули которые всегда заканчиваются на смещении 127.
Как будто память уже выделена по принципу 112 + 16.

	pResult := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 4)
	ToolTip % width "`n" height "`n" pResult
	DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", pimg, "ptr", pResult, "int", 0, "Cdecl")
	if ErrorLevel
		_Error(A_ThisFunc "`n" ErrorLevel) 
	off := 4, Type := "Ptr"  ;	Char Ptr
	While NumGet(pResult, (a_index-1) * off, Type) != ""
		str .=  (a_index-1) * off " : " NumGet(pResult, (a_index-1) * off, Type) "  "
	ToolTip % str
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39

Re: AHK: OpenCV определение лица

Надо было сделать простой тест, получается картинку cvCreateImage возвращает, но в структуре значения по нужным смещениям пусты?


#NoEnv
#SingleInstance Force 
OnExit, Exiting

SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\x86\vc14\bin

Global opencv := {opencv_highgui:  "opencv_highgui2413.dll"
, opencv_core: "opencv_core2413.dll"
, opencv_imgproc:  "opencv_imgproc2413.dll"}

_OpenCV_Startup()

SetWorkingDir %A_ScriptDir%

file := "1.jpg"
window := "gui"
pimg := _cvLoadImage(file)

pResult := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 4)
str := width " x " height "  " pResult "`n" 

DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", pimg, "ptr", pResult, "int", 0, "Cdecl")
if ErrorLevel
	_Error(A_ThisFunc "`n" ErrorLevel)
	
off := 1, Type := "Char"  ;	Char Ptr
While NumGet(pResult, (a_index-1) * off, Type) != ""
	str .=  (a_index-1) * off " : " NumGet(pResult, (a_index-1) * off, Type) "  "
ToolTip % str

_cvShowImage(window, pResult)

Esc::   
Exiting:
	If SecondExit || (0, SecondExit := 1)
		ExitApp 
	_cvReleaseImage(pResult)
	_cvReleaseImage(pImg)
	_Opencv_CloseDLL()
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

40

Re: AHK: OpenCV определение лица

Зависит от членов структуры - какие-то из них должны равняться нулю.
https://docs.opencv.org/2.4/modules/cor … l#iplimage

41

Re: AHK: OpenCV определение лица

Это понятно, но imageSize и imageData точно не нули.
А эти как будто заполняются ещё в cvCreateImage.

"int  nSize;" & _         ;  /* sizeof(IplImage) */
"int  ID;" & _           ;  /* version (=0)*/
"int  nChannels;" & _     ;  /* Most of OpenCV functions support 1,2,3 or 4 channels */
"int  alphaChannel;" & _   ;  /* Ignored by OpenCV */
"int  depth;" & 

Такое ощущение что по возвращённому CreateImage адресу надо выделить память, возможно не затрагивая какие то данные которые есть в нём.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

42

Re: AHK: OpenCV определение лица


VarSetCapacity(buff, 112, 0)
DllCall("msvcrt\memcpy", Ptr, &buff, Ptr, pResult, "Uint", 16, "Cdecl")
DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", pimg, "ptr", &buff, "int", 0, "Cdecl")

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

43

Re: AHK: OpenCV определение лица

int imageSize - у меня на x32 возвращается на смещении 64.

44

Re: AHK: OpenCV определение лица

У меня на x32 начиная с 16 везде нули, последнее смещение в списке 124, у тебя как?


#NoEnv
#SingleInstance Force 
OnExit, Exiting

xNN := A_PtrSize = 8 ? "x64" : "x86"

SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\%xNN%\vc14\bin

Global opencv := {opencv_highgui:  "opencv_highgui2413.dll"
, opencv_core: "opencv_core2413.dll"
, opencv_imgproc:  "opencv_imgproc2413.dll"}

_OpenCV_Startup()

SetWorkingDir %A_ScriptDir%

file := "1.jpg"
window := "gui"
pimg := _cvLoadImage(file)

pResult := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 4)
str := width " x " height "  " pResult "`n"   

DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", pimg, "ptr", pResult, "int", 0, "Cdecl")
if ErrorLevel
	_Error("cvCvtColor`n" ErrorLevel)
	
off := 4, Type := "Uint"  ;	Char Ptr  Uint
While NumGet(pResult, (a_index-1) * off, Type) != ""
	str .=  (a_index-1) * off " : " NumGet(pResult, (a_index-1) * off, Type) "  "
ToolTip % str

_cvShowImage(window, pResult)

Esc::   
Exiting:
	If SecondExit || (0, SecondExit := 1)
		ExitApp 
	_cvReleaseImage(pResult)
	_cvReleaseImage(pImg)
	_Opencv_CloseDLL()
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

45

Re: AHK: OpenCV определение лица

У тебя тут ошибка:

While NumGet(pResult, (a_index-1) * off, Type) != ""

Надо так:

While NumGet(pResult+0, (a_index-1) * off, Type) != ""

46

Re: AHK: OpenCV определение лица

Ты же мне это недавно объяснял...


https://i3.sndcdn.com/artworks-000322933404-2qsvhm-t500x500.jpg

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

47

Re: AHK: OpenCV определение лица

Единственное похожее на _WinAPI_CreateBitmap из того что я нашёл, это GdipCreateBitmapFromScan0, но не работает.


#NoEnv
#SingleInstance Force 
OnExit, Exiting


pToken := Gdip_Startup()

xNN := A_PtrSize = 8 ? "x64" : "x86"

SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\%xNN%\vc14\bin

Global opencv := {opencv_highgui:  "opencv_highgui2413.dll"
, opencv_core: "opencv_core2413.dll"
, opencv_imgproc:  "opencv_imgproc2413.dll"}

_OpenCV_Startup()

SetWorkingDir %A_ScriptDir%

file := "1.jpg"
window := "gui"
pimg := _cvLoadImage(file)

pResult := _cvCreateImage(_cvGetSize(pimg, width, height), 8, 4)

_cvCvtColor(pimg, pResult, 0)

; MsgBox % width " x " height "`n" NumGet(pResult+0, 40, "ptr") " x " NumGet(pResult+0, 44, "ptr") "`n" NumGet(pResult+0, 64, "uint")

pData := NumGet(pResult+0, 68, "ptr")

DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", 1, "int", 32, A_PtrSize = 8 ? "UPtr" : "UInt", pData, A_PtrSize = 8 ? "UPtr*" : "uint*", pBitmap)

MsgBox % pBitmap

_cvShowImage(window, pResult)

Esc::   
Exiting:
	If SecondExit || (0, SecondExit := 1)
		ExitApp 
	_cvReleaseImage(pResult)
	_cvReleaseImage(pImg)
	_Opencv_CloseDLL()
	
	Gdip_Shutdown(pToken) 
	ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

48

Re: AHK: OpenCV определение лица

А как ты искал?
Если зайти в справку по этой функции там идет отсылка на мсдн:
https://www.autoitscript.com/autoit3/do … Bitmap.htm

49

Re: AHK: OpenCV определение лица

Malcev пишет:

А как ты искал?

Как всегда плохо.
Не заметил ссылку снизу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

50

Re: AHK: OpenCV определение лица

Malcev
Спасибо большое, что помог разобратся.
Предлагаю добавить в библиотеку.
Но ещё вопрос, почему на х64 смещение больше на 20 а не на 16, ведь до imageData 4 указателя. И размер всего массива больше на 32, а указателей всего 6.

#NoEnv
#SingleInstance Force 
OnExit, Exiting

xNN := A_PtrSize = 8 ? "x64" : "x86"

S_WorkingDir := A_WorkingDir
SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\%xNN%\vc14\bin

Global opencv := {opencv_highgui:  "opencv_highgui2413.dll"
	, opencv_core: "opencv_core2413.dll"
	, opencv_imgproc:  "opencv_imgproc2413.dll"}
	
_OpenCV_Startup()

SetWorkingDir %S_WorkingDir%

oFiles := ["1.jpg", "2.jpg"]

STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0x0, SS_BITMAP := 0xE
WS_EX_COMPOSITED := E0x02000000  WS_EX_LAYERED := E0x00080000

Gui, -Caption +ToolWindow +E%WS_EX_COMPOSITED% +E%WS_EX_LAYERED%  
Gui, Margin, 0,0  
Gui, Add, Pic, hwndhPic %SS_BITMAP%

for i, file in oFiles
{
	pimage := _cvLoadImage(file) 
	hBitmap := _cvArrTohBitmap(pimage)
	SendMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap,, ahk_id %hPic%
	DllCall("DeleteObject", Ptr, ErrorLevel)
	Gui, Show, AutoSize NA x0 y0
	_cvReleaseImage(pimage) 
	MsgBox Next
}
ExitApp

Esc::   
Exiting:
	If SecondExit || (0, SecondExit := 1)
		ExitApp  
	_Opencv_CloseDLL() 
	ExitApp

_cvArrTohBitmap(pimage, byref width = "", byref height = "") { 
	Result := _cvCreateImage(_cvGetSize(pimage, width, height), 8, 4)
	_cvCvtColor(pimage, Result, 0)  
	pData := NumGet(Result + 0, 68 + 20 * (A_PtrSize = 8), "Ptr")
	hBitmap := DllCall("CreateBitmap", "Int", width, "Int", height, "UInt", 1, "UInt", 32, "Ptr", pData)
	Return hBitmap, _cvReleaseImage(Result)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

51 (изменено: Malcev, 2019-01-19 01:09:07)

Re: AHK: OpenCV определение лица

Похоже, что для x64 imageSize не int, а int64.
В библиотеку добавил.

52

Re: AHK: OpenCV определение лица

Malcev пишет:

Похоже, что для x64 imageSize не int, а int64.

Это какое то исключение из правила.

Не пойму где я тут мог накосячить.
ErrorLevel = -2: тип возвращаемого значения или один из указанных типов параметров недопустимы. Такая ошибка может также возникнуть, если в качестве параметра типа str передано выражение, возвращающее число.
A_LastError = 0.
На автоит работают.


; Local $_aResult = DllCall($_opencvDll_2, "double:cdecl", "cvGetCaptureProperty", "ptr", $pCvCapture, "int", $i)

_cvGetCaptureProperty(cap, iprop) {  
	Result := DllCall(opencv.opencv_highgui, "\cvGetCaptureProperty", "Ptr", cap, "Int", iprop, "Cdecl double")
	if ErrorLevel
		_Error(A_ThisFunc "`n" ErrorLevel)
	return Result
}

; Local $_aResult = DllCall($_opencvDll_2, "int:cdecl", "cvSetCaptureProperty", "ptr", $pCvCapture, "int", $CV_CAP_PROP_FRAME_HEIGHT, "double", $y)

_cvSetCaptureProperty(cap, iprop, value) {
	DllCall(opencv.opencv_highgui, "\cvSetCaptureProperty", "Ptr", cap, "Int", iprop, "double", value, "Cdecl")
	if ErrorLevel
		_Error(A_ThisFunc "`n" ErrorLevel) 
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

53

Re: AHK: OpenCV определение лица

А зачем у тебя тут запятая?

DllCall(opencv.opencv_highgui, "\cvGetCaptureProperty"

54

Re: AHK: OpenCV определение лица

Мда, плохо дело. )

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

55

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

Это какое то исключение из правила.

Вот тут вроде внесли изменения, но в документации этого не указали:
https://github.com/opencv/opencv/pull/7507
Как, например, и функция cvCaptureFromFile устарела и вместо нее надо использовать cvCreateFileCapture.
https://github.com/opencv/opencv/blob/m … o_c.h#L141
Но в документации к версии 2.4 этого не указано и функции cvCreateFileCapture вообще нет.
https://docs.opencv.org/2.4/modules/hig … deocapture
В общем некоторые вещи придется додумывать самому.

56

Re: AHK: OpenCV определение лица

А у тебя удалось запустить видео, ты в 7 приводил пример, но у меня cvCreateFileCapture возвращает ноль, ошибок нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

57

Re: AHK: OpenCV определение лица

У меня mp4 проигрывает.
Возможно у тебя нет нужного кодека.
http://robocraft.ru/blog/computervision/3026.html

58 (изменено: serzh82saratov, 2019-01-19 14:35:54)

Re: AHK: OpenCV определение лица

Я из всего понял

Например, в версии OpenCV 2.3.2 ffmpeg задействуется через opencv_ffmpeg.dll. Её надо кидать в папку к своему exe. И, вроде, всё. Во всяком случае при проигрывании файла *.mp4 именно её функции использовались для декодирования видео

естественно это не помогло, скрипт компилировал.
Кодеки поставил K-Lite Codec Pack Mega.
Функции типа - cvCreateFileCapture_VFW отсутствуют.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

59

Re: AHK: OpenCV определение лица

У меня на x32 работает без лишних телодвижений.
На x64 нужно файл "opencv-2.4.13.6-vc14\opencv\build\x64\vc14\bin\opencv_ffmpeg2413_64.dll" поместить в папку со скриптом.
У тебя так не получается?

60 (изменено: serzh82saratov, 2019-01-19 17:56:37)

Re: AHK: OpenCV определение лица

Да, заработало всё так как у тебя. Не знаю что было.

А понял, я закидывал файл из другой папки, он без 2413 в названии.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

61

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

заработало всё так как у тебя

Поправка, для х32 тоже нужна длл в папке с ехе.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

62

Re: AHK: OpenCV определение лица

Malcev, serzh82saratov - вот по тому вопросу который вы обсуждали.

Можете итоговый код ahk привести ?
Я тоже хочу посмотреть что у вас получилось.

63

Re: AHK: OpenCV определение лица

По которому вопросу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

64 (изменено: Malcev, 2019-01-20 18:53:26)

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?

Последняя из третьей версии - 3.4.5.
Проверил - приведенные здесь коды работают.
Там все лежит в одной длл и она скомпилирована только для x64.
Так как каскады Хаара подключаются только те, которые GPU (почему не знаю), то их надо скопировать из версии 2.4.13.6.

65

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

По которому вопросу.

Код по проигрыванию видео.

66

Re: AHK: OpenCV определение лица

 
#NoEnv
#SingleInstance Force
SetBatchLines, -1
OnExit, Exiting

xNN := A_PtrSize = 8 ? "x64" : "x86"

S_WorkingDir := A_WorkingDir
SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\%xNN%\vc14\bin

Global opencv := {opencv_core: "opencv_core2413.dll"
	, opencv_highgui: "opencv_highgui2413.dll"
	, opencv_imgproc: "opencv_imgproc2413.dll"}
	
window := "gui"

_OpenCV_Startup()

SetWorkingDir %A_ScriptDir%

file = -------------------------------

capture := _cvCaptureFromFile(file)

loop
{
	frame := _cvQueryFrame(capture)
	if !frame
		break
	_cvShowImage(window, frame)
	sleep 33
		if Close
	break
}
msgbox done
ExitApp

Esc:: Close := 1

Exiting:    
	If SecondExit || (0, SecondExit := 1)
		ExitApp  
	_cvReleaseCapture(Capture)
	_Opencv_CloseDLL()
	ExitApp
	
  ;	from me
  
_cvCaptureFromFile(filename)
{
   Result := DllCall(opencv.opencv_highgui "\cvCreateFileCapture", "AStr", filename, "Cdecl Ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvQueryFrame(capture)
{
   Result := DllCall(opencv.opencv_highgui "\cvQueryFrame", "Ptr", capture, "Cdecl Ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvReleaseCapture(cap){  
	DllCall(opencv.opencv_highgui "\cvReleaseCapture", "UIntP", cap, "Cdecl")  
}
 
_Error(val)
{
   msgbox % val "`nLastError - " A_LastError
   ; ExitApp
}

_OpenCV_Startup()
{
	For key, value in opencv 
		h := DllCall("LoadLibrary", "Str", value, "Ptr")  
}

_Opencv_CloseDLL()
{
	For key, value in opencv
	{ 
		if hModule := DllCall("GetModuleHandle", "str", value)
			DllCall("FreeLibrary", "ptr", hModule)
	}
}

_cvLoadImage(filename, iscolor := 1)  ;  CV_LOAD_IMAGE_COLOR
{
   Result := DllCall(opencv.opencv_highgui "\cvLoadImage", "AStr", filename, "int", iscolor, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvNamedWindow(name, flags := 0x00000001)   ;   CV_WINDOW_AUTOSIZE 
{
   DllCall(opencv.opencv_highgui "\cvNamedWindow", "AStr", name, "int", flags, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvShowImage(name, pimage)
{
	DllCall(opencv.opencv_highgui "\cvShowImage", "AStr", name, "ptr", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvCreateMat(cvrows, cvcols, cvtype)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMat", "int", cvrows, "int", cvcols, "int", cvtype, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvMatchTemplate(cvimage, cvtempl, cvresult, cvmethod)
{
   DllCall(opencv.opencv_imgproc "\cvMatchTemplate", "ptr", cvimage, "ptr", cvtempl, "ptr", cvresult, "int", cvmethod, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvNormalize(cvsrc, cvdst, cva, cvb, cvnorm_type, cvmask)
{
   DllCall(opencv.opencv_core "\cvNormalize", "ptr", cvsrc, "ptr", cvdst, "Double", cva, "Double", cvb, "int", cvnorm_type, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvThreshold(cvsrc, cvdst, cvthreshold, cvmax_value, cvthreshold_type)
{
   DllCall(opencv.opencv_imgproc "\cvThreshold", "ptr", cvsrc, "ptr", cvdst, "Double", cvthreshold, "Double", cvmax_value, "int", cvthreshold_type, "Cdecl double")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvSize(width, height)
{
   return width&0xFFFFFFFF|height<<32
}

_cvPoint(x, y)
{
   return x&0xFFFFFFFF|y<<32
}

_cvCreateImage(cvsize, cvdepth, cvchannels)
{
   Result := DllCall(opencv.opencv_core "\cvCreateImage", "int64", cvsize, "int", cvdepth, "int", cvchannels, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvGetSize(pimage, ByRef width := 0, ByRef height := 0)
{
   WidthHeight := DllCall(opencv.opencv_core "\cvGetSize", "ptr", pimage, "Cdecl int64")
   width := 0xFFFFFFFF & WidthHeight
   height := WidthHeight >> 32
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return WidthHeight
}

_cvScalar(value)
{
   VarSetCapacity(vScalar, 32, 0)
   if IsObject(value)
   {
      loop 4
         NumPut(value%A_Index%, vScalar, (A_Index-1)*8, "double")
   }
   else
   {
      loop 4
         NumPut(value, vScalar, (A_Index-1)*8, "double")
   }
   return &vScalar
}

_CV_RGB(cvRed, cvGreen, cvBlue)
{
   VarSetCapacity(vScalar, 32, 0)
   NumPut(cvBlue, vScalar, 0, "double")
   NumPut(cvGreen, vScalar, 8, "double")
   NumPut(cvRed, vScalar, 16, "double")
   NumPut(0, vScalar, 24, "double")
   return &vScalar
}

_cvSet(cvarr, cvvalue, cvmask := 0)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "double", NumGet(cvvalue+0, 0, "double"), "double", NumGet(cvvalue+0, 8, "double"), "double", NumGet(cvvalue+0, 16, "double"), "double", NumGet(cvvalue+0, 24, "double"), "ptr", cvmask, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvSet", "ptr", cvarr, "ptr", cvvalue, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvMinMaxLoc(cvarr, cvmin_val, cvmax_val, cvmin_loc, cvmax_loc, cvmask)
{
   DllCall(opencv.opencv_core "\cvMinMaxLoc", "ptr", cvarr, "ptr", cvmin_val, "ptr", cvmax_val, "ptr", cvmin_loc, "ptr", cvmax_loc, "ptr", cvmask, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvRectangle(cvimg, cvpt1, cvpt2, cvcolor, cvthickness, cvline_type, cvshift)
{
   if (A_PtrSize = 4)
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "double", NumGet(cvcolor+0, 0, "double"), "double", NumGet(cvcolor+0, 8, "double"), "double", NumGet(cvcolor+0, 16, "double"), "double", NumGet(cvcolor+0, 24, "double"), "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   else
      DllCall(opencv.opencv_core "\cvRectangle", "ptr", cvimg, "int64", cvpt1, "int64", cvpt2, "ptr", cvcolor, "int", cvthickness, "int", cvline_type, "int", cvshift, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvCvtColor(cvsrc, cvdst, cvcode)
{
   DllCall(opencv.opencv_imgproc "\cvCvtColor", "ptr", cvsrc, "ptr", cvdst, "int", cvcode, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel) 
	
}

_cvResize(cvsrc, cvdst, cvinterpolation := 1)   ; CV_INTER_LINEAR
{
   DllCall(opencv.opencv_imgproc "\cvResize", "ptr", cvsrc, "ptr", cvdst, "int", cvinterpolation, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvEqualizeHist(cvsrc, cvdst)
{
   DllCall(opencv.opencv_imgproc "\cvEqualizeHist", "ptr", cvsrc, "ptr", cvdst, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvLoad(cvfilename, cvmemstorage := 0, cvname := 0, cvreal_name := 0)
{
   Result := DllCall(opencv.opencv_core "\cvLoad", "AStr", cvfilename, "ptr", cvmemstorage, "ptr", cvname, "ptr", cvreal_name, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvCreateMemStorage(cvblock_size)
{
   Result := DllCall(opencv.opencv_core "\cvCreateMemStorage", "int", cvblock_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvClearMemStorage(cvstorage)
{
   DllCall(opencv.opencv_core "\cvClearMemStorage", "ptr", cvstorage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvHaarDetectObjects(cvimage, cvcascade, cvstorage, cvscale_factor := 1.1, cvmin_neighbors := 3, cvflags := 0, cvmin_size := 0, cvmax_size := 0)
{
   Result := DllCall(opencv.opencv_objdetect "\cvHaarDetectObjects", "ptr", cvimage, "ptr", cvcascade, "ptr", cvstorage, "double", cvscale_factor, "int", cvmin_neighbors, "int", cvflags, "int64", cvmin_size, "int64", cvmax_size, "Cdecl ptr")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvGetSeqElem(cvseq, cvindex)
{
   Result := DllCall(opencv.opencv_core "\cvGetSeqElem", "ptr", cvseq, "int", cvindex, "Cdecl ptr")
   if !Result or ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
   return Result
}

_cvReleaseImage(pimage)
{
   DllCall(opencv.opencv_core "\cvReleaseImage", "ptr*", pimage, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvReleaseMat(cvmat)
{
   DllCall(opencv.opencv_core "\cvReleaseMat", "ptr*", cvmat, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvDestroyAllWindows()
{
   DllCall(opencv.opencv_highgui "\cvDestroyAllWindows", "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}

_cvClearSeq(cvseq)
{
   DllCall(opencv.opencv_core "\cvClearSeq", "ptr", cvseq, "Cdecl")
   if ErrorLevel
      _Error(A_ThisFunc "`n" ErrorLevel)
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

67

Re: AHK: OpenCV определение лица


Почему-то не работает.

Выдает ошибку : 
_cvCaptureFromFile
0
LastError -2

68

Re: AHK: OpenCV определение лица

Так и не должен, если просто скопировать код и запустить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

69 (изменено: Путин ВВ, 2019-01-22 00:55:37)

Re: AHK: OpenCV определение лица

serzh82saratov, а как же с ним работать ?

70

Re: AHK: OpenCV определение лица

Путин ВВ пишет:

Почему-то не работает

Там путь надо прописать до видео, до длл, и длл в папку ахк положить, мы это обсуждали.
Вы же ничего не пишете о своих манипуляциях. Кто вас знает что вы не сделали, или сделали не так.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

71

Re: AHK: OpenCV определение лица

DLL с названиями opencv_core2413.dll, opencv_highgui2413.dll, opencv_imgproc2413.dll лежат рядом с файлом ahk который я пытаюсь запустить.

Путь к файлу прописан строчкой SetWorkingDir C:\1\888\1.avi

Запускаю скрипт и вот он выдает такую ошибку.

72

Re: AHK: OpenCV определение лица

xNN := A_PtrSize = 8 ? "x64" : "x86"

S_WorkingDir := A_WorkingDir
SetWorkingDir L:\AutoHotKey\opencv_project\opencv\build\%xNN%\vc14\bin

Здесь пишем путь к папке длл, x64 или x86 в ней заменяем на %xNN%.

Путин ВВ пишет:

Путь к файлу прописан строчкой SetWorkingDir C:\1\888\1.avi

Нет, SetWorkingDir трогать не надо, это надо писать в

file = -------------------------------
Путин ВВ пишет:

opencv_core2413.dll, opencv_highgui2413.dll, opencv_imgproc2413.dll

Как же вы спрашиваете код который обсуждали, а само обсуждение не читали?
Речь была про opencv_ffmpeg2413_64.dll и opencv_ffmpeg2413.dll, а к тем dll путь уже прописан в SetWorkingDir.

Путин ВВ пишет:

лежат рядом с файлом ahk который я пытаюсь запустить

Не с файлом анк, а рядом с AutoHotkey.exe который запускает анк файл.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

73

Re: AHK: OpenCV определение лица

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

Только - это просто окно с видео и ничего больше.
А где там  - распознавание объектов на видео и т.д. ?

74

Re: AHK: OpenCV определение лица

Путин ВВ, а с чего вы взяли, что мы "распознавание объектов на видео и т.д" с serzh82saratov обсуждали?

75

Re: AHK: OpenCV определение лица

Malcev, ну тут как бы речь об Opencv идет.
Там же главные фишки вроде - это анализ видео, детекция объектов.

А вот скажите как на это окно - с видеороликом - добавить детекцию движущихся объектов ?
Они такими желтыми рамочками выделяются.

Вот есть у opencv такая библиотека : opencv_objdetect2413d.dll
И даже есть статья https://docs.opencv.org/2.4/modules/objdetect/doc/objdetect.html

Как изменить этот скрипт (с воспроизведением видео) - чтобы библиотека opencv_objdetect2413d.dll - распознавала движущиеся объекты на видео ?

76

Re: AHK: OpenCV определение лица

Путин ВВ пишет:

А вот скажите как на это окно - с видеороликом - добавить детекцию движущихся объектов ?

Я уже вам говорил - гуглите нужный код на C# и переносите его на ахк.
У меня к вашей задаче интереса нет, поэтому копаться не хочу.

77

Re: AHK: OpenCV определение лица

Malcev, может вам тоже где пригодится.

78

Re: AHK: OpenCV определение лица

Вот если будет такая необходимость, то если что-то получится написать - выложу тут.
Но я бы на вашем месте на это не рассчитывал, а принялся за изучение сам, либо если по каким-то причинам такое невозможно, то нанял фрилансера.

79 (изменено: Malcev, 2019-01-22 21:17:49)

Re: AHK: OpenCV определение лица

Вот код, который вы можете попробовать перенести на ahk:
http://www.robindavid.fr/opencv-tutoria … pencv.html
В идеале сначала установить питон, посмотреть как код работает, что возвращает, после чего начать переносить.

80

Re: AHK: OpenCV определение лица

serzh82saratov пишет:

Но ещё вопрос, почему на х64 смещение больше на 20 а не на 16, ведь до imageData 4 указателя. И размер всего массива больше на 32, а указателей всего 6.

http://forum.script-coding.com/viewtopi … 64#p131564

81

Re: AHK: OpenCV определение лица

Спасибо, понял.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

82

Re: AHK: OpenCV определение лица

А в х86  кратным только 4?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

83

Re: AHK: OpenCV определение лица

Не совсем понял вопроса, но:

YMP пишет:

Элементы структуры выравниваются по "границе типа". Каждый элемент должен располагаться либо в начале структуры, либо по смещению от начала структуры, кратному его размеру. Если имеем структуру {char, short}, то второй элемент не может быть впритык к первому, т.к. имеет размер 2 байта и, значит, должен быть, как минимум, на смещении 2. Т.е. после char делается отступ в 1 байт, чтобы выравнять short.

Кроме того, размер структуры должен быть кратным самому большому её элементу. В структуре {short, char} к концу нужно добавить 1 байт, чтобы размер был не 3, а 4 байта, кратно short.

84

Re: AHK: OpenCV определение лица

Да, я спрашивал касается ли это только х64. Так понимаю это касается и х32.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

85

Re: AHK: OpenCV определение лица

Malcev Вроде вы помогали в работе этого скрипта https://github.com/manciuszz/AHK-OpenCV вместе с "Blackholyman", можете объяснить что он делает и как работает ?

GD

86

Re: AHK: OpenCV определение лица

Я не помогал, да и Blackholyman тоже.
Просто автор при создании класса пользовался мною перенесенными функциями с автоит.
Его скрипт определяет туловище с помощью haarcascade_fullbody.xml.
Подробнее читайте в справке по опенсиви.

87

Re: AHK: OpenCV определение лица

Ребятушки, вы такие молодцы! Спасибо вам огромное за ваш  труд! Предлагаю канонизировать Malcev! )

88 (изменено: pixel75, 2021-01-15 14:10:46)

Re: AHK: OpenCV определение лица

Приведенный выше скрипт достоит аплодисментов автору, ибо оный выше всяких похвал обрабатывает .jpg-изображения! Но у меня стоит задача работать с .bmp-изображениями, потому как у меня программно делается скриншот экрана в области координат с помощью вот такого фокуса:


	file = C:\Users\DonGustavo\Desktop\Open\baza.bmp
	screen(x,y,w,h, OutputFilePath, hwnd="") 
	{
		hwnd := (hwnd="") ? WinExist("A") : hwnd 										
		pBitmap := Gdip_BitmapFromScreen(0,raster)
		if (pBitmap < 1)
		pToken := Gdip_StartUp(), pBitmap := Gdip_BitmapFromScreen(0,raster)
		pBitmap2 := Gdip_CreateBitmap(w, h)
		G2 := Gdip_GraphicsFromImage(pBitmap2), Gdip_SetSmoothingMode(G2, 4), Gdip_SetInterpolationMode(G2, 7)
		Gdip_DrawImage(G2, pBitmap, 0, 0, w, h, x, y, w, h)
		Gdip_SaveBitmapToFile(pBitmap2, OutputFilePath)
		Gdip_DeleteGraphics(G2), Gdip_DisposeImage(pBitmap), Gdip_DisposeImage(pBitmap2)
		if (pToken != "")
		Gdip_ShutDown(pToken)
	}	

	screen(1059, 348, 220, 325, file, NoxPlayer) 

чтобы потом полученный скриншот скормить нейросети в качестве базового шаблона, чтобы на нём уже искать нужный мне элемент. Да, и кусок делающий bmp-скриншот и собственно код здешний по работе с OpenCV, заимствованы у не таких скудоумных, как я, и вероятно мсье знает толк в извращениях, если попытается конвертировать затем bmp в jpg, что безусловно отнимает время и потому  оперативности не добавляет. Потому не лучше ли спросить людей уважаемых, как же, либо заставить снимать скриншот в .jpg, либо понять, можно ли скармливать .bmp, либо же совсем не скриншотить ничего, а как то искать в динамичном окне игры( например!) элемент с помощью локализованной Malcev OpenCV  на подобие того, как находилось бы искомое на потоковом видео?  Прошу не троллинга и  попыток петросянить, но прошу совета.

89

Re: AHK: OpenCV определение лица

pixel75 пишет:

как же, либо заставить снимать скриншот в .jpg

Замените в первой строчке bmp на jpg.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

90

Re: AHK: OpenCV определение лица

Лучше так:
https://stackoverflow.com/questions/141 … 3#14167433

91

Re: AHK: OpenCV определение лица

Спасибо Вам, дорогие товарищи большущее! С меня кружка пива в жаркий день!

92 (изменено: pixel75, 2021-01-16 14:14:15)

Re: AHK: OpenCV определение лица

Слепил из любезно предоставленного кода выше, функцию, в которую мне удобно передавать начальную точку поиска фрагмента, его ширину и высоту, коэффициент совпадения, и два имени файла - шаблон и искомое.


	poisk_image(x, y, w, h, coef_sovp, f1, f2)
	{
		file1 := f1
		file2 := f2
		window := "gui"	
		_OpenCV_Startup()		
		pimg := _cvLoadImage(file1)		; базовый скриншот
		ptemp := _cvLoadImage(file2) 		; искомое изображение			
		_cvNamedWindow(window)
		_cvShowImage(window, pimg)
		_cvGetSize(pimg, width, height)
		_cvGetSize(ptemp, width2, height2)
		rw :=  width - width2 + 1
		rh :=  height - height2 + 1
		presult := _cvCreateMat(rh, rw, CV_32FC1 := 5)
		_cvMatchTemplate(pimg, ptemp, presult, CV_TM_CCOEFF_NORMED := 5)		
		_cvNormalize(presult, presult, 0, CV_C := 1, CV_MINMAX := 32, 0)
		_cvThreshold(presult, presult, coef_sovp, maxval := 1, CV_THRESH_BINARY := 0)
		VarSetCapacity(pmaxloc, 8, 0)
		VarSetCapacity(pminloc, 8, 0)
		VarSetCapacity(pmaxval, 8, 0)
		VarSetCapacity(pminval, 8, 0)
		pmask := _cvCreateImage(_cvSize(rw, rh), IPL_DEPTH_8U := 8, channels := 1)		
		_cvSet(pmask, _cvScalar(vScalar, 1))
		; Найти местоположение максимума
		_cvMinMaxLoc(presult, &pminval, &pmaxval, &pminloc, &pmaxloc, pmask)	

		loop
		{	; все, найденные со схожестью thresh := 0.94, подобия на базовом изображении 
			; обрамляется красной рамкой, если найдены
			_cvRectangle(pmask, _cvPoint(NumGet(pmaxloc, 0, "int")-5, NumGet(pmaxloc, 4, "int")-5), _cvPoint(NumGet(pmaxloc, 0, "int")+ width2, NumGet(pmaxloc, 4, "int")+height2), _cvScalar(vScalar, 0), -1, 8, 0)
			_cvRectangle(pimg, _cvPoint(NumGet(pmaxloc, 0, "int")-5, NumGet(pmaxloc, 4, "int")-5), _cvPoint(NumGet(pmaxloc, 0, "int")+ width2+10, NumGet(pmaxloc, 4, "int")+height2+10), _CV_RGB(vScalar, 255, 0, 0), 2, 8, 0)
			; вывод обновлённого базового изображения
			_cvShowImage(window, pimg)
			; найти местоположение максимума			
			_cvMinMaxLoc(presult, &pminval, &pmaxval, &pminloc, &pmaxloc, pmask)
			; где &pminval - указатель на возвращаемое минимальное значение
			; &pmaxval - указатель на возвращаемое максимальное значение
			; &pminloc - указатель на возвращаемое минимальное местоположение
			; &pmaxloc - указатель на максимальное возвращаемое местоположение
			; pmask - необязательная маска, которая используется для выбора подмассива			
			if (NumGet(pmaxval, 0, "double") < 0.99)
				break
			Sleep 100
		}
		Return
	}

	poisk_image(1645, 204, 120, 250, 0.94, f1 := "1.jpg", f2 := "2.jpg")

	Msgbox done
	_cvReleaseImage(pmask)
	_cvReleaseMat(presult)
	_cvReleaseImage(ptemp)
	_cvReleaseImage(pimg)
	_cvDestroyAllWindows()
	_Opencv_CloseDLL()

Прошу о помощи по пунктам:
1. Откуда теперь собственно можно вычленить готовую точку координат найденного искомого, чтобы я потом мог кликать на найденный фрагмент или принимать решение в зависимости от того, нашелся фрагмент или нет в заданном коэффициенте совпадения?
2. Как убрать отображение окон базового скриншота, результата поиска, прорисовку чертовых рамок ,которые мне не нужны, не сломав при этом функционал?
Мне НЕ нужно: перебирать всё множество, выводить окно, обрамлять найденное. Мне нужно искать только ОДНО совпадение и просто вывести в Tooltip итоговые координаты или высоту c шириной, поделив которые пополам, я нашел бы центр искомого с тем, чтобы кликнуть туда, например. Другими словами, я просто хочу замену стандартному ImageSearch но в новом костюмчике с большими карманами, чтобы не закапываться в python, а оставаться преданным autohotkey, в рамках привычного понимания, которого и без пайтона ничтожно мало)

93

Re: AHK: OpenCV определение лица

file1 := "1.jpg"
file2 := "2.jpg"

;start dll opencv
Global opencv := { opencv_core: "opencv_core2413.dll"
, opencv_highgui: "opencv_highgui2413.dll"
, opencv_imgproc: "opencv_imgproc2413.dll" }
_OpenCV_Startup()

;// load IPL type image both images must have same number of bits and color channels!
pimg := _cvLoadImage(file1)
ptemp := _cvLoadImage(file2) ;image to look for

;// Determine images height and width to create results matrix
_cvGetSize(pimg, width, height)
_cvGetSize(ptemp, width2, height2)
rw :=  width - width2 + 1
rh :=  height - height2 + 1

;// Create Opencv matrix object 32 bit floating
presult := _cvCreateMat(rh, rw, CV_32FC1 := 5)

;// Template matching
_cvMatchTemplate(pimg, ptemp, presult, CV_TM_CCOEFF_NORMED := 5)
_cvNormalize(presult, presult, 0, CV_C := 1, CV_MINMAX := 32, 0)
_cvThreshold(presult, presult, thresh := 0.9, maxval := 1, CV_THRESH_BINARY := 0)

;//locate matches
;// Create minmax variables to pass to opencv
VarSetCapacity(pmaxloc, 8, 0)
VarSetCapacity(pminloc, 8, 0)
VarSetCapacity(pmaxval, 8, 0)
VarSetCapacity(pminval, 8, 0)

;// Find location of maximum
_cvMinMaxLoc(presult, &pminval, &pmaxval, &pminloc, &pmaxloc, pmask)

msgbox % NumGet(pmaxloc, 0, "int") "`n" NumGet(pmaxloc, 4, "int")
_cvReleaseMat(presult)
_cvReleaseImage(ptemp)
_cvReleaseImage(pimg)
_Opencv_CloseDLL()
ExitApp

94

Re: AHK: OpenCV определение лица

Malcev  Вы истинный волшебник, спасибо, что Вы есть!

95

Re: AHK: OpenCV определение лица

OpenCV v4 COM:
https://www.autoitscript.com/forum/topi … ncv-v4-udf

96

Re: AHK: OpenCV определение лица

Вау! Пробовал что-то?
UPD: Рано обрадовался, думал, это новая нативная фича у них появилась, а так только с AutoIt можно использовать, перевести всё это проблематично.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

97 (изменено: Malcev, 2021-11-06 23:08:46)

Re: AHK: OpenCV определение лица

Да, не. Там всё несложно.
http://forum.script-coding.com/viewtopic.php?id=16712