stereo-vision
All Data Structures Namespaces Functions Modules Pages
descriptor.cpp
1 /*
2 Copyright 2011. All rights reserved.
3 Institute of Measurement and Control Systems
4 Karlsruhe Institute of Technology, Germany
5 
6 This file is part of libelas.
7 Authors: Andreas Geiger
8 
9 libelas is free software; you can redistribute it and/or modify it under the
10 terms of the GNU General Public License as published by the Free Software
11 Foundation; either version 3 of the License, or any later version.
12 
13 libelas is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
15 PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License along with
18 libelas; if not, write to the Free Software Foundation, Inc., 51 Franklin
19 Street, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21 
22 #include "descriptor.h"
23 #include "filter.h"
24 #include <emmintrin.h>
25 
26 using namespace std;
27 
28 Descriptor::Descriptor(uint8_t* I,int32_t width,int32_t height,int32_t bpl,bool half_resolution) {
29  I_desc = (uint8_t*)_mm_malloc(16*width*height*sizeof(uint8_t),16);
30  uint8_t* I_du = (uint8_t*)_mm_malloc(bpl*height*sizeof(uint8_t),16);
31  uint8_t* I_dv = (uint8_t*)_mm_malloc(bpl*height*sizeof(uint8_t),16);
32  filter::sobel3x3(I,I_du,I_dv,bpl,height);
33  createDescriptor(I_du,I_dv,width,height,bpl,half_resolution);
34  _mm_free(I_du);
35  _mm_free(I_dv);
36 }
37 
38 Descriptor::~Descriptor() {
39  _mm_free(I_desc);
40 }
41 
42 void Descriptor::createDescriptor (uint8_t* I_du,uint8_t* I_dv,int32_t width,int32_t height,int32_t bpl,bool half_resolution) {
43 
44  uint8_t *I_desc_curr;
45  uint32_t addr_v0,addr_v1,addr_v2,addr_v3,addr_v4;
46 
47  // do not compute every second line
48  if (half_resolution) {
49 
50  // create filter strip
51  for (int32_t v=4; v<height-3; v+=2) {
52 
53  addr_v2 = v*bpl;
54  addr_v0 = addr_v2-2*bpl;
55  addr_v1 = addr_v2-1*bpl;
56  addr_v3 = addr_v2+1*bpl;
57  addr_v4 = addr_v2+2*bpl;
58 
59  for (int32_t u=3; u<width-3; u++) {
60  I_desc_curr = I_desc+(v*width+u)*16;
61  *(I_desc_curr++) = *(I_du+addr_v0+u+0);
62  *(I_desc_curr++) = *(I_du+addr_v1+u-2);
63  *(I_desc_curr++) = *(I_du+addr_v1+u+0);
64  *(I_desc_curr++) = *(I_du+addr_v1+u+2);
65  *(I_desc_curr++) = *(I_du+addr_v2+u-1);
66  *(I_desc_curr++) = *(I_du+addr_v2+u+0);
67  *(I_desc_curr++) = *(I_du+addr_v2+u+0);
68  *(I_desc_curr++) = *(I_du+addr_v2+u+1);
69  *(I_desc_curr++) = *(I_du+addr_v3+u-2);
70  *(I_desc_curr++) = *(I_du+addr_v3+u+0);
71  *(I_desc_curr++) = *(I_du+addr_v3+u+2);
72  *(I_desc_curr++) = *(I_du+addr_v4+u+0);
73  *(I_desc_curr++) = *(I_dv+addr_v1+u+0);
74  *(I_desc_curr++) = *(I_dv+addr_v2+u-1);
75  *(I_desc_curr++) = *(I_dv+addr_v2+u+1);
76  *(I_desc_curr++) = *(I_dv+addr_v3+u+0);
77  }
78  }
79 
80  // compute full descriptor images
81  } else {
82 
83  // create filter strip
84  for (int32_t v=3; v<height-3; v++) {
85 
86  addr_v2 = v*bpl;
87  addr_v0 = addr_v2-2*bpl;
88  addr_v1 = addr_v2-1*bpl;
89  addr_v3 = addr_v2+1*bpl;
90  addr_v4 = addr_v2+2*bpl;
91 
92  for (int32_t u=3; u<width-3; u++) {
93  I_desc_curr = I_desc+(v*width+u)*16;
94  *(I_desc_curr++) = *(I_du+addr_v0+u+0);
95  *(I_desc_curr++) = *(I_du+addr_v1+u-2);
96  *(I_desc_curr++) = *(I_du+addr_v1+u+0);
97  *(I_desc_curr++) = *(I_du+addr_v1+u+2);
98  *(I_desc_curr++) = *(I_du+addr_v2+u-1);
99  *(I_desc_curr++) = *(I_du+addr_v2+u+0);
100  *(I_desc_curr++) = *(I_du+addr_v2+u+0);
101  *(I_desc_curr++) = *(I_du+addr_v2+u+1);
102  *(I_desc_curr++) = *(I_du+addr_v3+u-2);
103  *(I_desc_curr++) = *(I_du+addr_v3+u+0);
104  *(I_desc_curr++) = *(I_du+addr_v3+u+2);
105  *(I_desc_curr++) = *(I_du+addr_v4+u+0);
106  *(I_desc_curr++) = *(I_dv+addr_v1+u+0);
107  *(I_desc_curr++) = *(I_dv+addr_v2+u-1);
108  *(I_desc_curr++) = *(I_dv+addr_v2+u+1);
109  *(I_desc_curr++) = *(I_dv+addr_v3+u+0);
110  }
111  }
112  }
113 
114 }