Hızlı yaklaşık optik akış / görüntü kaydırma


9

Operatöre yavaşlama uyarısı vermek için bir kameranın ne kadar hızlı (yatay / dikey) kaydırma yaptığını algılamam gerekiyor.

Tüm görüntü bir blok olarak hareket ediyor, gerçek bir yöne ihtiyacım yok (H veya V bir bonus olsa da) ve sadece yaklaşık bir büyüklüğe ihtiyacım var - yani. kareler arasında 'N' pikselden fazla kayma olursa tetikleyici.

Görüntüler büyük ve genellikle tekdüze düşük kontrastlı sahnelerdir, izlenecek belirgin bir vurgu yok. Gerçek zamanlı (60fps) ve tüm CPU'yu kullanmadan yapmam gerekiyor.

Niave çözümü, merkezde bir ROI seçmek, kenarları bulmak, çerçeve çiftleri arasındaki benzerliği hesaplamak, karelerden birini bir piksel ile sola / sağa / yukarı / aşağı kaydırmak, tekrarla - bul minima.

Daha akıllı bir çözüm olup olmadığını merak ettim.

Yanıtlar:


3

Muhtemelen basit bir yöntem arıyorsanız , MPEG sınıf sıkıştırma kodeklerinde çok olgunlaşan standart Hareket Tahmini algoritmalarını uygulamaktır. Anlamak kolaydır ve sanırım çok sayıda kullanıma hazır kod alırsınız. Bu algoritma blok bazında hareket vektörü üretir - ve sonra en belirgin kümeyi bulabilir ve ortalama hareket vektörü yönünü ve büyüklüğünü alabilirsiniz.

MPEG4 - kamera hareketini ve kaydırmayı ilk olarak tahmin etmeye ve telafi etmeye çalışan bir teknik olan " Global Hareket telafisi " olarak adlandırılan başka bir anahtar kavramı vardır . Güzelliği, bu tür yöntemlerin karmaşıklığa bağlı olarak daha basit veya kapsamlı olabilmesidir. İşte bir örnek kağıt ve bunun için başka bir kağıt .

Genel olarak, kamera kaydırma ve hareket tahmini oldukça yerleşik bir araştırma alanıdır. işte bir referans: kağıt ve başka bir kağıt .

Bu konuda. Hem katı hem de doğru algoritmanın yanı sıra basit ve hızlı algoritmaları bulacaksınız.


Eğer iyi olacak bir MPEG kütüphanesine rahatça girebilirsem, Mpeg'deki GMC'nin eleştirileri olduğunu hatırlıyorum. Kamera sabitleme algoritmaları nedeniyle ortak bir alan olacağını düşündüm
Martin Beckett

MPEG algoritmalarını kesinlikle bağlayabilirsiniz (veya daha doğrusu ayıklayabilirsiniz). FFMPEG'i kitaplık olarak kullanabilir ve ayıklayabilirsiniz - ancak zor olabilir. Alternatif olarak, ayıklanacak MSSG'nin düzgün kodunu okuyabilirsiniz .
Dipan Mehta

GMC'ye yönelik eleştiriyle ilgili olarak - bit hızını önemli ölçüde azaltmak ve nesne tabanlı kodlama oluşturmak için daha fazla söz veriyor . Ancak, kamera hareket parametrelerini tahmin etmek o kadar da zor değil.
Dipan Mehta

teşekkürler, MSSG'ye bir göz atacağım. Ben ffmpeg kullanıyorum ama sadece bir şeyler çıkarmak kolay bir kütüphane değil!
Martin Beckett

3

Bu yavaş bir korkunç çözüm olabilir, ancak sonraki karelerin FFT tabanlı çapraz korelasyonunu yapabilir ve ardından kareler arasındaki dengeyi tanımlamak için zirveyi bulabilirsiniz. İşlemci döngülerini kaydetmek için görüntüyü yalnızca küçük bir alt kümesinde yapın.

Bir kareden diğerine döndürme veya sert sahne değişiklikleri ile işe yaramaz ve muhtemelen daha iyi yöntemler vardır. Bu bir tür "Bir çekiçim var, bu yüzden her şey çivi gibi görünüyor" çözümü. Sanırım bu, naif çözümünüz gibi, ancak kenar algılamaya gerek yok ve FFT, her seferinde bir pikseli açıkça kaydırmaktan çok daha hızlı hale getiriyor.

Bu soru benzerdir ve hiç kimse çapraz korelasyondan başka bir şey önermez, bu yüzden belki de fena değil: Ardışık görüntüler arasındaki ofseti hesaplamak için MATLAB kullanma


Teşekkürler, FFT'nin yavaş olduğunu varsaymak kolaydır, ancak küçük bir 2 ^ n penceresi yapabilirim. ps. Sadece arama için stackoverflow.com/questions/1100100/…
Martin Beckett

3

Hızı ve yönü tahmin etmenin bir yolu, görüntünün merkezinde örneğin dört pencerenin "yerel" bir akış tahminini yapmak olacaktır. Lucas-Kanade diferansiyel yöntemi yer değiştirmenin yaklaşık olarak sabit olduğunu ve bu nedenle denklem olarak çözülmenin mümkün olduğunu varsayar.

Bu yüzden adım adım rehberim:

  1. Görüntünün ortasındaki piksel penceresini alın, örneğin 20x20
  2. Ix ve Iy gradyanlarını hesaplayın.
  3. Degrade penceresini dört parçaya bölün, örneğin 4x10x10.
  4. Sonraki kareyle dört doğrusal en küçük kareler denklemini çözün.
  5. Dört hız vektörünü ortalayın.

Bu, yönü ve hızı belirler, ancak daha sağlam hale getirmek için ağırlıklı bir pencere kullanabilirsiniz. Bak Lucas Kanade yöntemine onun uzantıları için.


0

Çapraz korelasyonun ofseti bulmak için iyi bir yaklaşım olduğunu düşünüyorum, ancak bunu gerçekten hızlı yapmak istiyorsanız, o zaman sadece tek bir dikey ve tek bir yatay tarama çizgisiyle (yani görüntünün merkezi aracılığıyla) kısıtlamayı deneyebilirsiniz. Her iki karedeki tarama çizgileri arasındaki çapraz korelasyonun hesaplanması size yatay ve dikey ofsetin yaklaşık bir değerini verecektir.


Bu işe yarayabilir, ancak çapraz olarak kaydırılıyorsa, yanlara doğru kaydırırken yukarı ve aşağı biraz titremesine rağmen iyi çalışmaz. Resmin ortasındaki dikdörtgen bir alt bölgenin daha iyi olacağını düşünüyorum.
endolith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.