2
* Copyright 2010-2011, Sikuli.org
3
* Released under the MIT License.
10
typedef INT32 int32_t;
14
ImageRecord::write(ostream& output_stream){
15
output_stream.write((char *) this, sizeof(class ImageRecord));
19
ImageRecord::read(istream& input_stream){
20
input_stream.read((char *) this, sizeof(class ImageRecord));
28
Database::find(Mat image){
29
vector<ImageRecord> top_matches;
30
vector<ImageRecord> records;
32
records = create_image_records_from_image(image);
34
for (vector<ImageRecord>::iterator r = records.begin();
35
r != records.end(); ++r){
37
//cout << endl << r->area << " : ";
38
vector<ImageRecord> matches = find(*r);
39
for (vector<ImageRecord>::iterator m = matches.begin();
40
m != matches.end(); ++m){
42
//cout << "(" << m->screenshot_id << ":" << m->id << ")";
46
top_matches.push_back(matches[0]);
54
Database::find(const char* filename){
55
Mat image = imread(filename, 1);
60
Database::insert(const ImageRecord& b){
61
_image_records.push_back(b);
65
Database::find(const ImageRecord& q){
67
vector<ImageRecord> ret;
69
vector<ImageRecord>::iterator it = _image_records.begin();
70
for (; it != _image_records.end(); ++it){
74
if (abs(q.area - it->area) > 10)
77
if (abs(q.height - it->height) > 5)
80
if (abs(q.width - it->width) > 5)
87
if (abs(q.mr - it->mr) > 10)
90
if (abs(q.mg - it->mg) > 10)
93
if (abs(q.mb - it->mb) > 10)
96
// cout << it->id << ": ";
97
// cout << q.mr*s << " " << q.mg*s << " " << q.mb*s << "<->";
98
// cout << p.mr << " " << p.mg << " " << p.mb << endl;
109
static int image_record_id = 0;
110
static int word_id = 0;
115
Database::insert_file(const char* filename, int screenshot_id){
117
Mat image = imread(filename, 1);
121
// sprintf(buf,"%s.ui",filename);
122
// std::ofstream fout(buf);
124
sprintf(buf,"%s.ui",filename);
125
std::ofstream fout_loc(buf);
127
vector<Blob> text_blobs, image_blobs;
128
cvgui::segmentScreenshot(image, text_blobs, image_blobs);
131
vector<ImageRecord> records;
132
records = create_image_records_from_blobs(image, image_blobs);
134
for (int i = 0; i < image_blobs.size(); ++i){
137
Blob& b = image_blobs[i];
138
ImageRecord& r = records[i];
140
// ignore small elements
141
if (r.width < 15 || r.height < 15)
144
vector<ImageRecord> matches;
147
if (matches.empty()){
154
Mat part(image, b.bound);
155
sprintf(buf, "research/result/ir-%d-%d.png",word_id,image_record_id);
162
r.id = matches[0].id;
165
//fout << "ui" << r.id << " ";
169
fout_loc << r.x << " " << r.y << " " << r.width << " " << r.height << " ";
170
fout_loc << "ui" << r.id;
180
Database::create_image_records_from_image(Mat image){
181
vector<Blob> text_blobs;
182
vector<Blob> image_blobs;
184
cvgui::segmentScreenshot(image, text_blobs, image_blobs);
185
return create_image_records_from_blobs(image, image_blobs);
191
Database::create_image_records_from_imagefile(const char* filename){
192
Mat image = imread(filename, 1);
193
return create_image_records_from_image(image);
198
Database::create_image_records_from_blobs(const Mat& src, const vector<Blob> image_blobs){
201
vector<ImageRecord> ret;
204
for (vector<Blob>::const_iterator b = image_blobs.begin();
205
b != image_blobs.end(); ++b){
215
ib.height = r.height;
220
meanStdDev(part, mean, stddev, Mat());
239
//vector<ImageRecord>
240
//ImageRecord::create_from_imagefile(const char* filename){
242
// vector<Blob> text_blobs;
243
// vector<Blob> image_blobs;
245
// Mat image = imread(filename, 1);
246
// cvgui::segmentScreenshot(image, text_blobs, image_blobs);
248
// return ImageRecord::create_from_blobs(image, image_blobs);
252
//vector<ImageRecord>
253
//ImageRecord::create_from_blobs(const Mat& src, const vector<Blob> image_blobs){
256
// vector<ImageRecord> ret;
259
// for (vector<Blob>::const_iterator b = image_blobs.begin();
260
// b != image_blobs.end(); ++b){
264
// Rect r = b->bound;
269
// //sprintf(buf, "research/result/ir-%d.png",image_record_id);
270
// //imwrite(buf, part);
276
// ib.width = r.width;
277
// ib.height = r.height;
278
// ib.area = b->area;
280
// ret.push_back(ib);
282
// //image_record_id++;
289
Database::write(ostream& stream){
291
int32_t num_records = _image_records.size();
292
stream.write((char *)(&num_records), sizeof(int32_t));
294
for (int jj = 0; jj < num_records; ++jj) {
295
_image_records[jj].write(stream);
300
Database::read(istream& stream){
302
stream.read((char *)(&num_records), sizeof(int32_t));
304
for (int jj = 0; jj < num_records; ++jj) {
307
_image_records.push_back(rec);