← Back to projects

Real-Time Target Detection and Tracking

Role
Software engineer
Organisation
Digitest Defence and Aerospace
Period
2021-2024
Team
6-10 engineer software team
C++Thermal imagingCUDA COpenMP

Confidentiality note

This work is subject to confidentiality obligations. Client and product names, performance parameters, screenshots and test data are deliberately omitted; the account stays at the level of the engineering problem solved and the technology used. Technical detail can be shown in person, to the extent confidentiality allows.

The problem

I developed real-time image processing based target detection and tracking software for a defence industry client. The detection side was written in C++, the tracking side in Python. I built the data-driven symbol overlay rendering on live video and the operator interface in Qt Creator/C++.

To meet the real-time throughput requirement I built parallel processing pipelines with C++ multithreading, CUDA C and OpenMP. The whole pipeline was integrated to run on NVIDIA Jetson embedded platforms, with data exchange carried over TCP, UDP and UART.

C++PythonCUDA COpenMP Qt CreatorNVIDIA JetsonTCP/UDP/UARTMultithreading

Visual and thermal channels

The system works on both visual and thermal/infrared camera feeds: the same detection and tracking pipeline locks onto aerial targets, including drones, across both spectra, with real-time bounding boxes, crosshair targeting and data-driven symbol overlay rendered onto the live video.

Everything beyond what these frames show stays confidential: no end-client names, no performance parameters, no test data. More can be discussed in person, to the extent confidentiality allows.

Visual (left) and thermal/infrared (right) camera feeds: real-time bounding box, crosshair targeting and symbol overlay. As published in my portfolio.

Fielded, operational software: this is the project where I learned what it takes for a detector to survive outside the lab, on real hardware, on a real video feed, for years.

// Uretici-tuketici iskeleti: yakalama asla cikarimi beklemez.
// Kuyruk dolarsa EN ESKI kare atilir; gercek zamanda gecikme,
// kare kaybindan daha pahalidir.
template <typename T>
class SinirliKuyruk {
  std::deque<T> q_; std::mutex m_; std::condition_variable cv_;
  size_t kapasite_;
public:
  void koy(T kare) {
    { std::lock_guard<std::mutex> k(m_);
      if (q_.size() >= kapasite_) q_.pop_front();   // eskiyi at
      q_.push_back(std::move(kare)); }
    cv_.notify_one();
  }
  T al() {
    std::unique_lock<std::mutex> k(m_);
    cv_.wait(k, [&]{ return !q_.empty(); });
    T kare = std::move(q_.front()); q_.pop_front();
    return kare;
  }
};
Simplified, representative snippet: the bounded-queue idea behind the real-time pipeline. No project code is shown.