Тема: AHK: OpenCV определение лица
Тема для обсуждения "OpenCV определение лица".
http://forum.script-coding.com/viewtopic.php?id=17653
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Тема для обсуждения "OpenCV определение лица".
http://forum.script-coding.com/viewtopic.php?id=17653
А в чём вопрос-то?
А вопросов пока нету,
На нашем форуме еще OpenCV не обсуждался, а возможности, как я понимаю, у него большие.
Можно тут пообсуждать, померить скорость, запостить заготовки-примеры, если у кого имеются.
Malcev, а как мне запустить этот - приведенный вами скрипт ?
То есть нужна какая-то картинка с лицом, и скрипт что сделает ?
Определит координаты лица на фотографии ?
Malcev, так....
Ну в общем - более менее запустил эту систему.
А вот там еще есть кроме указанных библиотек dll - еще и другие библиотеки.
Ну например - которые распознают объекты на видео.
(Наверное это библиотека: opencv_video2413.dll )
Вот как это реализовать в autohotkey ?
там еще есть кроме указанных библиотек 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/
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
}
А что пишет?
Конечно надо.
И не какую-то, а для показа видео конкретно одну - opencv_highgui2413.dll.
Плюс еще надо функции с первого поста перенести + еще написать самому функцию для освобождения ресурсов.
// освобождаем ресурсы
cvReleaseCapture( &capture );
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 );
Я добавил все нужные файлы dll
Нужный файл dll только один.
Зачем вы освобождаете ресурсы до того как успели их заполнить?
cvReleaseCapture( &capture ); - это на С.
Вам нужно перенести ее на ahk.
Для этого надо посмотреть в документации, к какой функции и к какой dll она обращается и вызвать ее на ahk через dllcall.
Malcev, а в какой документации это смотреть ?
Где эта документация ?
Malcev, а в какой документации это смотреть ?
Где эта документация ?
Вы по ссылкам заходите, которые я вам постил?
Информация которая может вам пригодиться:
https://autohotkey.com/board/topic/6741 … g-etc-etc/
Ну и разумеется:
https://docs.opencv.org/2.4/
Malcev, да заходил.
Я просто там не особо понимаю где что.
Большое количество команд или библиотек связанных с видео.
Какая из них за что отвечает за простой вывод видео в интерфейс - непонятно.
(Эти команды же - в сокращенном виде написаны.)
А вам для начала и не надо понимать. Например я тоже не понимаю.
Берете урок, смотрите какие команды там используются.
Вбиваете их в поиске на сайте opencv.
И дальше вызываете их через dllcall.
Если же для вас dllcall пока тёмный лес, то тогда читаете справку и пытаетесь понять как работают примеры приведенные в справке.
Разобрался с запуском, лицо определяет. )
А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?
А сможет машинка определить картинки, на которых текст?
А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?
Потому что я переносил код с автоит, а он был написан под 2.4.5 dll.
А сможет машинка определить картинки, на которых текст?
Уверен, что без проблем. Надо искать примеры на C и переводить их на ahk.
Ты не пробовал перевести эту функцию.
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
Не,кроме тех двух больше не переводил.
А что ты хочешь сделать?
Так ну первым делом картинку выводить в своё окно.
Можешь перевести на "русский":
$tIplImage = DllStructCreate($tagIplImage, $pIplImage)
Выводить картинку - это так:
;// 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 на автохотки.
Выводить картинку - это так:
Это во всех примерах есть, я про своё окно, надо битмап получать.
DllStructCreate на автоит это VarSetCapacity на автохотки.
Это тоже понял, не понимаю что передаётся в tagIplImage.
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 */
Ок.
DllStructGetData($tIplImagedst,'imageData')
Pointer [необязательный] Если структуре не выделена память, но используется указатель.
А тут что значит строка вторым параметром?
DllStructCreate($tagIplImage, $pIplImage)
И тут я пропустил, она создаёт структуру из указателя на другую структуру?
Точнее пишет в неё.
$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;
И тут я пропустил, она создаёт структуру из указателя на другую структуру?
А я сам толком тонкостей не знаю.
Но как я понял на автоит нельзя напрямую получать данные из памяти из возвращаемой какой-либо функцией структуры.
Поэтому вначале передается структура через DllStructCreate, а потом уже используются DllStructGetData и другие функции.
$tagIplImage получается не нужен, так как он требуется только для получения размеров, а у тебя есть _cvGetSize
А что именно ты хочешь сделать? Какой конкретно код перевести и для чего?
struct _IplROI *roi; /* Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI; /* Must be NULL. */
void *imageId; /* " " */
struct _IplTileInfo *tileInfo; /* " " */
Это всё ссылки - следовательно ptr.
Какой конкретно код перевести и для чего?
Этот например https://www.autoitscript.com/forum/topi … mory-leak/.
А что именно ты хочешь сделать?
Вывести картинку в своё гуи.
Но как я понял на автоит нельзя напрямую получать данные из памяти из возвращаемой какой-либо функцией структуры.
Поэтому вначале передается структура через 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.
https://autoit-script.ru/autoit3_docs/f … llCall.htm
dllcall возвращает массив.
aResult[0] - это то что возвращает сама dllcall на ahk.
Судя по всему она содержит структуру, которую потом надо передать через следующий вызов dllcall.
В автохотки с этим заморачиваться не надо, зато надо с подсчетом членов структуры и выравниванием их при передачи копии структуры.
В автоит есть функция для определения размера структуры:
https://www.autoitscript.com/autoit3/do … etSize.htm
Local $pIplImagedst = $_aResult[0]
Local $tIplImagedst = DllStructCreate($tagIplImage, $pIplImagedst)
ToolTip(DllStructGetSize($tIplImagedst))
Вот так.
Почему 112 а не 88 в х32. Похоже что ptr занимает 8 байт.
Похоже что ptr занимает 8 байт.
Не должно.
PTR 32 or 64bit pointer (depending on if the x86 or x64 version of AutoIt is used)
Наверное не так посчитал.
"int BorderMode[4];" & _ ; /* Ignored by OpenCV. */
"int BorderConst[4]
Опять я то что в квадратных скобках не умножил.
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
Надо было сделать простой тест, получается картинку 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
Зависит от членов структуры - какие-то из них должны равняться нулю.
https://docs.opencv.org/2.4/modules/cor … l#iplimage
Это понятно, но 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 адресу надо выделить память, возможно не затрагивая какие то данные которые есть в нём.
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")
И в новую структуру старую не записать, так как судя по всему требуется оригинальный адрес.
int imageSize - у меня на x32 возвращается на смещении 64.
У меня на 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
У тебя тут ошибка:
While NumGet(pResult, (a_index-1) * off, Type) != ""
Надо так:
While NumGet(pResult+0, (a_index-1) * off, Type) != ""
Ты же мне это недавно объяснял...
Единственное похожее на _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
А как ты искал?
Если зайти в справку по этой функции там идет отсылка на мсдн:
https://www.autoitscript.com/autoit3/do … Bitmap.htm
А как ты искал?
Как всегда плохо.
Не заметил ссылку снизу.
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)
}
Похоже, что для x64 imageSize не int, а int64.
В библиотеку добавил.
Похоже, что для 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)
}
А зачем у тебя тут запятая?
DllCall(opencv.opencv_highgui, "\cvGetCaptureProperty"
Мда, плохо дело. )
Это какое то исключение из правила.
Вот тут вроде внесли изменения, но в документации этого не указали:
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
В общем некоторые вещи придется додумывать самому.
А у тебя удалось запустить видео, ты в 7 приводил пример, но у меня cvCreateFileCapture возвращает ноль, ошибок нет.
У меня mp4 проигрывает.
Возможно у тебя нет нужного кодека.
http://robocraft.ru/blog/computervision/3026.html
Я из всего понял
Например, в версии OpenCV 2.3.2 ffmpeg задействуется через opencv_ffmpeg.dll. Её надо кидать в папку к своему exe. И, вроде, всё. Во всяком случае при проигрывании файла *.mp4 именно её функции использовались для декодирования видео
естественно это не помогло, скрипт компилировал.
Кодеки поставил K-Lite Codec Pack Mega.
Функции типа - cvCreateFileCapture_VFW отсутствуют.
У меня на x32 работает без лишних телодвижений.
На x64 нужно файл "opencv-2.4.13.6-vc14\opencv\build\x64\vc14\bin\opencv_ffmpeg2413_64.dll" поместить в папку со скриптом.
У тебя так не получается?
Да, заработало всё так как у тебя. Не знаю что было.
А понял, я закидывал файл из другой папки, он без 2413 в названии.
заработало всё так как у тебя
Поправка, для х32 тоже нужна длл в папке с ехе.
Malcev, serzh82saratov - вот по тому вопросу который вы обсуждали.
Можете итоговый код ahk привести ?
Я тоже хочу посмотреть что у вас получилось.
По которому вопросу.
А почему ты используешь 2.4.13.6, а не последнюю 3.4.3?
Последняя из третьей версии - 3.4.5.
Проверил - приведенные здесь коды работают.
Там все лежит в одной длл и она скомпилирована только для x64.
Так как каскады Хаара подключаются только те, которые GPU (почему не знаю), то их надо скопировать из версии 2.4.13.6.
По которому вопросу.
Код по проигрыванию видео.
#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)
}
Почему-то не работает.
Выдает ошибку :
_cvCaptureFromFile
0
LastError -2
Так и не должен, если просто скопировать код и запустить.
serzh82saratov, а как же с ним работать ?
Почему-то не работает
Там путь надо прописать до видео, до длл, и длл в папку ахк положить, мы это обсуждали.
Вы же ничего не пишете о своих манипуляциях. Кто вас знает что вы не сделали, или сделали не так.
DLL с названиями opencv_core2413.dll, opencv_highgui2413.dll, opencv_imgproc2413.dll лежат рядом с файлом ahk который я пытаюсь запустить.
Путь к файлу прописан строчкой SetWorkingDir C:\1\888\1.avi
Запускаю скрипт и вот он выдает такую ошибку.
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 который запускает анк файл.
serzh82saratov, так все - вроде разобрался.
Запустил скрипт - и запустилось окно с видеороликом.
Только - это просто окно с видео и ничего больше.
А где там - распознавание объектов на видео и т.д. ?
Путин ВВ, а с чего вы взяли, что мы "распознавание объектов на видео и т.д" с serzh82saratov обсуждали?
Malcev, ну тут как бы речь об Opencv идет.
Там же главные фишки вроде - это анализ видео, детекция объектов.
А вот скажите как на это окно - с видеороликом - добавить детекцию движущихся объектов ?
Они такими желтыми рамочками выделяются.
Вот есть у opencv такая библиотека : opencv_objdetect2413d.dll
И даже есть статья https://docs.opencv.org/2.4/modules/objdetect/doc/objdetect.html
Как изменить этот скрипт (с воспроизведением видео) - чтобы библиотека opencv_objdetect2413d.dll - распознавала движущиеся объекты на видео ?
А вот скажите как на это окно - с видеороликом - добавить детекцию движущихся объектов ?
Я уже вам говорил - гуглите нужный код на C# и переносите его на ахк.
У меня к вашей задаче интереса нет, поэтому копаться не хочу.
Malcev, может вам тоже где пригодится.
Вот если будет такая необходимость, то если что-то получится написать - выложу тут.
Но я бы на вашем месте на это не рассчитывал, а принялся за изучение сам, либо если по каким-то причинам такое невозможно, то нанял фрилансера.
Вот код, который вы можете попробовать перенести на ahk:
http://www.robindavid.fr/opencv-tutoria … pencv.html
В идеале сначала установить питон, посмотреть как код работает, что возвращает, после чего начать переносить.
Но ещё вопрос, почему на х64 смещение больше на 20 а не на 16, ведь до imageData 4 указателя. И размер всего массива больше на 32, а указателей всего 6.
Спасибо, понял.
А в х86 кратным только 4?
Не совсем понял вопроса, но:
Элементы структуры выравниваются по "границе типа". Каждый элемент должен располагаться либо в начале структуры, либо по смещению от начала структуры, кратному его размеру. Если имеем структуру {char, short}, то второй элемент не может быть впритык к первому, т.к. имеет размер 2 байта и, значит, должен быть, как минимум, на смещении 2. Т.е. после char делается отступ в 1 байт, чтобы выравнять short.
Кроме того, размер структуры должен быть кратным самому большому её элементу. В структуре {short, char} к концу нужно добавить 1 байт, чтобы размер был не 3, а 4 байта, кратно short.
Да, я спрашивал касается ли это только х64. Так понимаю это касается и х32.
Malcev Вроде вы помогали в работе этого скрипта https://github.com/manciuszz/AHK-OpenCV вместе с "Blackholyman", можете объяснить что он делает и как работает ?
Я не помогал, да и Blackholyman тоже.
Просто автор при создании класса пользовался мною перенесенными функциями с автоит.
Его скрипт определяет туловище с помощью haarcascade_fullbody.xml.
Подробнее читайте в справке по опенсиви.
Ребятушки, вы такие молодцы! Спасибо вам огромное за ваш труд! Предлагаю канонизировать Malcev! )
Приведенный выше скрипт достоит аплодисментов автору, ибо оный выше всяких похвал обрабатывает .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 на подобие того, как находилось бы искомое на потоковом видео? Прошу не троллинга и попыток петросянить, но прошу совета.
как же, либо заставить снимать скриншот в .jpg
Замените в первой строчке bmp на jpg.
Спасибо Вам, дорогие товарищи большущее! С меня кружка пива в жаркий день!
Слепил из любезно предоставленного кода выше, функцию, в которую мне удобно передавать начальную точку поиска фрагмента, его ширину и высоту, коэффициент совпадения, и два имени файла - шаблон и искомое.
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, в рамках привычного понимания, которого и без пайтона ничтожно мало)
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
Malcev Вы истинный волшебник, спасибо, что Вы есть!
OpenCV v4 COM:
https://www.autoitscript.com/forum/topi … ncv-v4-udf
Вау! Пробовал что-то?
UPD: Рано обрадовался, думал, это новая нативная фича у них появилась, а так только с AutoIt можно использовать, перевести всё это проблематично.
Да, не. Там всё несложно.
http://forum.script-coding.com/viewtopic.php?id=16712
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться