照片人脸特征点手动提取数据程序
一、代码
#include<opencv2/opencv.hpp>
#include<iostream>
#define SFN 10
using namespace std;
using namespace cv;
const string SF="D:\\code\\c\\opencv\\opencv_face_detection_database\\sample\\";
const string SOutput="D:\\code\\c\\opencv\\opencv_face_detection_database\\output\\";
const Size dsize =Size (800,600);
void on_mouse(int event, int x, int y, int flags, void* userdata);
string change_int_to_char(int a);
void change_string_to_char(string s);
char char_filename[1024];
int sn=1;
FILE *fp;
int main()
{
string filename,filename_txt;
namedWindow("img");
Mat img,new_img;
for(int i=1; i<=SFN; i++)
{
filename=SF+change_int_to_char(i)+".jpg";
img = imread(filename,1);
if(img.empty())
{
cout<<"出现错误"<<endl<<filename<<endl;
return 0;
}
resize(img,new_img,dsize);
imwrite(filename,new_img);
img=new_img;
filename_txt=SOutput+change_int_to_char(i)+".txt";
change_string_to_char(filename_txt);
fp=fopen(char_filename,"wb");
if(fp==NULL)
{
cout<<"出现错误"<<endl<<filename_txt<<endl;
return 0;
}
setMouseCallback("img", on_mouse,&img);
while (1)
{
imshow("img", img);
waitKey(40);
if(sn==30)
{
sn=1;
fclose(fp);
break;
}
}
setMouseCallback("img",NULL,NULL);
}
}
void on_mouse(int EVENT, int x, int y, int flags, void* userdata)
{
Mat img;
img= *(Mat*)userdata;
Point p(x, y);
char s[20];
switch (EVENT)
{
case EVENT_LBUTTONDOWN:
{
sprintf(s,"%d",sn);
circle(img, p, 2, Scalar(255),3);
putText(img,s,p,FONT_HERSHEY_PLAIN,1,Scalar(255,255,255),2,8,0);
fprintf(fp,"%d %d ",x,y);
sn++;
}
break;
}
}
string change_int_to_char(int a)
{
string jpg="";
if(a==0)
{
return "0";
}
int b,t;
char c[10];
t=0;
while(a!=0)
{
b=a%10;
a/=10;
c[++t]=b+'0';
}
for(int i=t; i>=1; i--)
jpg+=c[i];
return jpg;
}
void change_string_to_char(string s)
{
long long unsigned int t=0;
while(t<s.size())
{
char_filename[t]=s[t];
t++;
}
char_filename[t]='\0';
return ;
}
二、使用方法
1.SF为输入照片的路径,照片命名格式按顺序命名为1.jpg、2.jpg……不允许有跳跃
2.SOuput为输出路径,输出的txt文件,命名为1.txt、2.txt,文件为自动生成,但必须要有文件夹。