mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-09 21:17:06 +03:00
92 lines
2.6 KiB
C++
92 lines
2.6 KiB
C++
#include "CFindTemplate.h"
|
|
|
|
void CFindTemplate::FindTemplate(std::string _template, int* found_x, int* found_y)
|
|
{
|
|
FindTemplate(_template, found_x, found_y, 0, 0);
|
|
}
|
|
|
|
void CFindTemplate::FindTemplate(std::string _template, int* found_x, int* found_y, int _dx, int _dy)
|
|
{
|
|
uint8_t* rgb_template = stbi_load(_template.c_str(), &tpl_width, &tpl_height, &tpl_bpp, channels);
|
|
|
|
int ow, ow_start, ow_stop;
|
|
int oh, oh_start, oh_stop;
|
|
|
|
if (_dx == 0)
|
|
{
|
|
_dx = width;
|
|
*found_x = 0;
|
|
}
|
|
|
|
if (_dy == 0)
|
|
{
|
|
_dy = height;
|
|
*found_y = 0;
|
|
}
|
|
|
|
|
|
ow_start = *found_x - _dx;
|
|
ow_start = std::max(ow_start, 0);
|
|
ow_stop = *found_x + _dx;
|
|
if ((ow_stop + tpl_width) > width)
|
|
ow_stop = width - tpl_width;
|
|
ow = ow_stop - ow_start + 1;
|
|
|
|
oh_start = *found_y - _dy;
|
|
oh_start = std::max(oh_start, 0);
|
|
oh_stop = *found_y + _dy;
|
|
if ((oh_stop + tpl_height) > height)
|
|
oh_stop = height - tpl_height;
|
|
oh = oh_stop - oh_start + 1;
|
|
|
|
uint8_t* odata = (unsigned char*)GET_MEMORY(ow * oh * channels);
|
|
|
|
double aktSAD;
|
|
double minSAD = pow(tpl_width * tpl_height * 255, 2);
|
|
|
|
RGBImageLock();
|
|
|
|
for (int xouter = ow_start; xouter <= ow_stop; xouter++)
|
|
for (int youter = oh_start; youter <= oh_stop; ++youter)
|
|
{
|
|
aktSAD = 0;
|
|
for (int tpl_x = 0; tpl_x < tpl_width; tpl_x++)
|
|
for (int tpl_y = 0; tpl_y < tpl_height; tpl_y++)
|
|
{
|
|
stbi_uc* p_org = rgb_image + (channels * ((youter + tpl_y) * width + (xouter + tpl_x)));
|
|
stbi_uc* p_tpl = rgb_template + (channels * (tpl_y * tpl_width + tpl_x));
|
|
aktSAD += pow(p_tpl[0] - p_org[0], 2);
|
|
}
|
|
stbi_uc* p_out = odata + (channels * ((youter - oh_start) * ow + (xouter - ow_start)));
|
|
|
|
p_out[0] = int(sqrt(aktSAD / (tpl_width * tpl_height)));
|
|
if (aktSAD < minSAD)
|
|
{
|
|
minSAD = aktSAD;
|
|
*found_x = xouter;
|
|
*found_y = youter;
|
|
}
|
|
}
|
|
|
|
RGBImageRelease();
|
|
|
|
stbi_write_bmp("sdcard\\find.bmp", ow, oh, channels, odata);
|
|
|
|
stbi_image_free(odata);
|
|
stbi_image_free(rgb_template);
|
|
}
|
|
|
|
void CFindTemplate::FindTemplate(std::string _template, int* found_x, int* found_y, std::string _imageout)
|
|
{
|
|
FindTemplate(_template, found_x, found_y);
|
|
SaveToFile(_imageout);
|
|
}
|
|
|
|
void CFindTemplate::FindTemplate(std::string _template, int* found_x, int* found_y, int _dx, int _dy, std::string _imageout)
|
|
{
|
|
FindTemplate(_template, found_x, found_y, _dx, _dy);
|
|
SaveToFile(_imageout);
|
|
}
|
|
|
|
|