| 151 | |
| 152 | /// |
| 153 | cv::Mat DrawTracksOnMap(const std::vector<TrackingObject>& tracks) |
| 154 | { |
| 155 | if (m_map.empty()) |
| 156 | return cv::Mat(); |
| 157 | |
| 158 | cv::Mat map = m_map.clone(); |
| 159 | |
| 160 | #if 1 // Debug output |
| 161 | // Draw bindings points |
| 162 | for (size_t i = 0; i < m_geoPoints.size(); ++i) |
| 163 | { |
| 164 | cv::Point_<T> gp1(m_geoPoints[i % m_geoPoints.size()]); |
| 165 | cv::Point p1(m_p2mParams.Geo2Pix(gp1)); |
| 166 | |
| 167 | cv::Point_<T> gp2(m_geoPoints[(i + 1) % m_geoPoints.size()]); |
| 168 | cv::Point p2(m_p2mParams.Geo2Pix(gp2)); |
| 169 | |
| 170 | cv::line(map, p1, p2, cv::Scalar(255, 255, 255), 2, cv::LINE_AA); |
| 171 | |
| 172 | //std::cout << p1 << " - " << p2 << std::endl; |
| 173 | |
| 174 | std::stringstream label; |
| 175 | label << std::fixed << std::setw(5) << std::setprecision(5) << "[" << m_geoPoints[i].x << ", " << m_geoPoints[i].y << "]"; |
| 176 | int baseLine = 0; |
| 177 | double fontScale = (map.cols < 1000 && map.rows < 1000) ? 0.5 : 1.; |
| 178 | cv::Size labelSize = cv::getTextSize(label.str(), cv::FONT_HERSHEY_TRIPLEX, fontScale, 1, &baseLine); |
| 179 | cv::putText(map, label.str(), p1, cv::FONT_HERSHEY_TRIPLEX, fontScale, cv::Scalar(255, 255, 255)); |
| 180 | } |
| 181 | #endif |
| 182 | |
| 183 | // Draw tracks |
| 184 | for (const auto& track : tracks) |
| 185 | { |
| 186 | if (track.m_lastRobust) |
| 187 | { |
| 188 | auto geoCenter = Pix2Geo(track.m_rrect.center); |
| 189 | auto center = m_p2mParams.Geo2Pix(geoCenter); |
| 190 | //std::cout << "Convert: " << track.m_rrect.center << " -> " << geoCenter << " -> " << center << std::endl; |
| 191 | if (center.x > 0 && center.x < map.cols && center.y > 0 && center.y < map.rows) |
| 192 | cv::ellipse(map, center, cv::Size(5, 5), 0, 0, 360, cv::Scalar(255, 0, 255), cv::FILLED, 8); |
| 193 | } |
| 194 | } |
| 195 | |
| 196 | return map; |
| 197 | } |
| 198 | |
| 199 | private: |
| 200 | std::vector<cv::Point> m_framePoints; |