Gerçek Zamanlı Hedef Tespit ve Takip
Gizlilik notu
Bu çalışma gizlilik yükümlülüğüne tabidir. Müşteri ve ürün adları, performans parametreleri, ekran görüntüleri ve test verileri bilinçli olarak yer almamaktadır; anlatım yalnızca çözülen mühendislik problemi ve kullanılan teknoloji düzeyindedir. Teknik detaylar, gizliliğin izin verdiği ölçüde yüz yüze aktarılabilir.
Problem
Savunma sanayii müşterisi için gerçek zamanlı görüntü işleme tabanlı hedef tespit ve takip yazılımı geliştirdim. Tespit tarafı C++, takip tarafı Python ile yazıldı. Gerçek zamanlı görüntü üzerine veriye dayalı sembol çizdirme (overlay) ve operatör arayüzünü Qt Creator/C++ ile geliştirdim.
Gerçek zamanlı işleme gereksinimini karşılamak için C++ multithreading, CUDA C ve OpenMP ile paralel işleme hatları kurdum. Tüm hat NVIDIA Jetson gömülü platformlar üzerinde çalışacak şekilde entegre edildi; veri alışverişi TCP, UDP ve UART protokolleri üzerinden yürütüldü.
Görünür ve termal kanallar
Sistem hem görünür hem termal/kızılötesi kamera akışında çalışıyor: aynı tespit ve takip hattı, drone dahil hava hedeflerine iki spektrumda da kilitleniyor; gerçek zamanlı sınırlayıcı kutu, nişangâh ve veriye dayalı sembol katmanı canlı görüntünün üzerine çiziliyor.
Bu karelerin gösterdiğinin ötesindeki her şey gizli: son müşteri adı yok, performans parametresi yok, test verisi yok. Fazlası yüz yüze konuşulabilir, gizliliğin izin verdiği ölçüde.

Sahaya inmiş, operasyonel yazılım: bir dedektörün laboratuvar dışında, gerçek donanımda, gerçek görüntü akışında yıllarca ayakta kalması için ne gerektiğini bu projede öğrendim.
// 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;
}
};