/////////////////////////////////////////////////////////////////////////////////////////
| 114 | |
| 115 | ////////////////////////////////////////////////////////////////////////////////////////////// |
| 116 | void |
| 117 | pcl::LINEMOD::matchTemplates (const std::vector<QuantizableModality*> & modalities, std::vector<LINEMODDetection> & detections) const |
| 118 | { |
| 119 | // create energy maps |
| 120 | std::vector<EnergyMaps> modality_energy_maps; |
| 121 | const std::size_t nr_modalities = modalities.size(); |
| 122 | for (std::size_t modality_index = 0; modality_index < nr_modalities; ++modality_index) |
| 123 | { |
| 124 | const QuantizedMap & quantized_map = modalities[modality_index]->getSpreadedQuantizedMap (); |
| 125 | |
| 126 | const std::size_t width = quantized_map.getWidth (); |
| 127 | const std::size_t height = quantized_map.getHeight (); |
| 128 | |
| 129 | const unsigned char * quantized_data = quantized_map.getData (); |
| 130 | |
| 131 | const unsigned char nr_bins = 8; |
| 132 | EnergyMaps energy_maps; |
| 133 | energy_maps.initialize (width, height, nr_bins); |
| 134 | //std::vector< unsigned char* > energy_maps(nr_bins); |
| 135 | for (unsigned char bin_index = 0; bin_index < nr_bins; ++bin_index) |
| 136 | { |
| 137 | //energy_maps[bin_index] = new unsigned char[width*height]; |
| 138 | //memset (energy_maps[bin_index], 0, width*height); |
| 139 | |
| 140 | const auto base_bit = static_cast<unsigned char> (0x1); |
| 141 | auto val0 = static_cast<unsigned char> (base_bit << bin_index); // e.g. 00100000 |
| 142 | auto val1 = static_cast<unsigned char> (val0 | (base_bit << (bin_index+1)&7) | (base_bit << (bin_index+7)&7)); // e.g. 01110000 |
| 143 | auto val2 = static_cast<unsigned char> (val1 | (base_bit << (bin_index+2)&7) | (base_bit << (bin_index+6)&7)); // e.g. 11111000 |
| 144 | auto val3 = static_cast<unsigned char> (val2 | (base_bit << (bin_index+3)&7) | (base_bit << (bin_index+5)&7)); // e.g. 11111101 |
| 145 | for (std::size_t index = 0; index < width*height; ++index) |
| 146 | { |
| 147 | if ((val0 & quantized_data[index]) != 0) |
| 148 | ++energy_maps (bin_index, index); |
| 149 | if ((val1 & quantized_data[index]) != 0) |
| 150 | ++energy_maps (bin_index, index); |
| 151 | if ((val2 & quantized_data[index]) != 0) |
| 152 | ++energy_maps (bin_index, index); |
| 153 | if ((val3 & quantized_data[index]) != 0) |
| 154 | ++energy_maps (bin_index, index); |
| 155 | } |
| 156 | } |
| 157 | |
| 158 | modality_energy_maps.push_back (energy_maps); |
| 159 | } |
| 160 | |
| 161 | // create linearized maps |
| 162 | const std::size_t step_size = 8; |
| 163 | std::vector<std::vector<LinearizedMaps> > modality_linearized_maps; |
| 164 | for (std::size_t modality_index = 0; modality_index < nr_modalities; ++modality_index) |
| 165 | { |
| 166 | const std::size_t width = modality_energy_maps[modality_index].getWidth (); |
| 167 | const std::size_t height = modality_energy_maps[modality_index].getHeight (); |
| 168 | |
| 169 | std::vector<LinearizedMaps> linearized_maps; |
| 170 | const std::size_t nr_bins = modality_energy_maps[modality_index].getNumOfBins (); |
| 171 | for (std::size_t bin_index = 0; bin_index < nr_bins; ++bin_index) |
| 172 | { |
| 173 | unsigned char * energy_map = modality_energy_maps[modality_index] (bin_index); |
no test coverage detected