I've been working on facial recognition and have obtained a dll that can recognize faces in an image, and gives cordinates aswell.
It came with an example program written in C++ and I'm trying to port it to python. Here is the C++ code
#include "windows.h"
#include "loadbmp.h" // from http://gpwiki.org/index.php/LoadBMPCpp
#include "fdlib.h"
void main(int argc, char *argv[])
{
int i, n, x[256], y[256], size[256], w, h, threshold;
BMPImg *bi;
unsigned char *bgrdata, *graydata;
if (argc==1)
{
printf("usage: fdtest bmpfilename [threshold]\n");
exit(0);
}
bi = new BMPImg();
printf("\nloading %s\n", argv[1]);
bi->Load(argv[1]);
w = bi->GetWidth();
h = bi->GetHeight();
printf("image is %dx%d pixels\n", w, h);
bgrdata = bi->GetImg();
graydata = new unsigned char[w*h];
for (i=0; i<w*h; i++)
{
graydata[i] = (unsigned char) ((.11*bgrdata[3*i] + .59*bgrdata[3*i+1] + .3*bgrdata[3*i+2]));
//if (i<10) printf("%d ", graydata[i]);
}
threshold = argc>2 ? atoi(argv[2]) : 0;
printf("detecting with threshold = %d\n", threshold);
fdlib_detectfaces(graydata, w, h, threshold);
n = fdlib_getndetections();
if (n==1)
printf("%d face found\n", n);
else
printf("%d faces found\n", n);
for (i=0; i<n; i++)
{
fdlib_getdetection(i, x+i, y+i, size+i);
printf("x:%d y:%d size:%d\n", x[i], y[i], size[i]);
}
delete[] graydata;
delete bi;
}
The "bgrdata = bi->GetImg();" seems like it is the same as pythons Image modules getpixel(), as in returns a tuple of the RGB values for the given pixel. I could be wrong.
But what I need help with is the graydata.
for (i=0; i<w*h; i++)
{
graydata[i] = (unsigned char) ((.11*bgrdata[3*i] + .59*bgrdata[3*i+1] + .3*bgrdata[3*i+2]));
//if (i<10) printf("%d ", graydata[i]);
}
I know graydata is an array of grayscale values. I convert my image from RGB to grayscale with the Image module and then convert the each pixel value to a ctype to place in the graydata array:
while i < 307200: #size of image (640*480)
graydata[i] = c_ubyte(gl[i]) #gl = list of grayscale values
i += 1
but when I pass it to the dll i get:
>>> fd.fdlib_detectfaces(graydata, w, h, threshold)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Procedure probably called with too many arguments (16 bytes in exces
s)
I didn't know whether to post this problem here, or in the C++ forums.
What am I doing wrong?