Videoyu Okuyun ve İşleyin: CameraServer Sınıfı

Kavramlar

Genellikle FRC | reg | içinde kullanılan kameralar (Axis kamera gibi ticari USB ve Ethernet kameraları) nispeten sınırlı çalışma modları sunar. Genel olarak, tek bir çözünürlük ve kare hızında yalnızca tek bir görüntü çıkışı (tipik olarak JPG gibi bir RGB sıkıştırılmış biçimde) sağlarlar. Bir seferde yalnızca bir uygulama kameraya erişebileceğinden, USB kameralar özellikle sınırlıdır.

CameraServer birden fazla kamerayı destekler. Bir kameranın bağlantısı kesildiğinde otomatik olarak yeniden bağlanma gibi ayrıntıları yönetir ve ayrıca kameradaki görüntüleri birden çok “clients-istemciye” sunar (örneğin, hem robot kodunuz hem de kontrol paneliniz kameraya aynı anda bağlanabilir).

Kamera Adları

CameraServer’daki her kamera benzersiz bir şekilde adlandırılmalıdır. Bu aynı zamanda Panodaki kamera için görünen addır. CameraServer’ın `` startAutomaticCapture ()`` ve `` addAxisCamera ()`` işlevlerinin bazı varyantları, kamerayı otomatik olarak adlandırır (örneğin, “USB Kamera 0” veya “Eksen Kamera”) veya kameraya daha açıklayıcı bir ad verebilirsiniz (örneğin “Giriş Kamı”). Tek şart, her kameranın benzersiz bir isme sahip olmasıdır.

USB Kamera Notları

CPU kullanımı

CameraServer, yalnızca gerektiğinde sıkıştırma ve açma işlemlerini gerçekleştirerek ve hiçbir istemci bağlı değilken akışı otomatik olarak devre dışı bırakarak CPU kullanımını en aza indirecek şekilde tasarlanmıştır.

CPU kullanımını en aza indirmek için, gösterge paneli çözünürlüğü kamera ile aynı çözünürlüğe ayarlanmalıdır; bu, CameraServer’ın görüntüyü açıp yeniden sıkıştırmamasına izin verir; bunun yerine, kameradan alınan JPEG görüntüsünü doğrudan kontrol paneline iletebilir. Kontrol panelindeki çözünürlüğün değiştirilmesinin kamera çözünürlüğünü * değiştirmediğini * unutmamak önemlidir; kamera çözünürlüğünü değiştirmek, kamera nesnesi üzerinde `` setResolution ()`` çağrısı yapılarak yapılabilir.

USB Bant Genişliği

RoboRIO, USB arayüzleri üzerinden bir seferde yalnızca bu kadar çok veriyi iletebilir ve alabilir. Kamera görüntüleri çok fazla veri gerektirebilir ve bu nedenle bu sınıra uymak nispeten kolaydır. Bir USB bant genişliği hatasının en yaygın nedeni, JPEG olmayan bir video modu seçmek veya özellikle birden fazla kamera bağlıyken çok yüksek bir çözünürlük çalıştırmaktır.

Mimari

CameraServer iki katmandan oluşur; yüksek düzeyli WPILib CameraServer class ve düşük düzey cscore library.

CameraServer Sınıfı

CameraServer sınıfı (WPILib’in bir parçası), robot kodunuza kamera eklemek için yüksek düzeyde bir arayüz sağlar. Ayrıca, LabVIEW Dashboard ve Shuffleboard gibi Driver Station panolarının kameraları listeleyebilmesi ve akışlarının nerede konumlandığını belirleyebilmesi için, kameralar ve kamera sunucuları hakkındaki bilgileri NetworkTables’da yayınlamaktan sorumludur. Oluşturulan tüm kameraların ve sunucuların bir veritabanını korumak için tek bir model kullanır.

CameraServer’daki bazı temel işlevler şunlardır:

  • startAutomaticCapture () : Bir USB kamera ekleyin (örn.Microsoft LifeCam) ve panodan görüntülenebilmesi için onun için bir sunucu başlatır.

  • addAxisCamera () : Bir Axis kamerası ekleyin. Axis kamerasından görüntüleri robot kodunuzda işlemiyor olsanız bile, Axis kamerasının Dashboard’un açılır kamera listesinde görünmesi için bu işlevi kullanmak isteyebilirsiniz. Ayrıca bir sunucu başlatır, böylece sürücü istasyonunuz roboRIO’ya USB aracılığıyla bağlandığında Axis akışı hala görüntülenebilir (iki robot radyo Ethernet portuna hem Axis kamera hem de roboRIO bağlıysa rekabette yararlıdır).

  • getVideo (): Bir kameraya OpenCV erişimi sağlayın. Bu, roboRIO’da (robot kodunuzda) görüntü işleme için kameradan görüntüler almanızı sağlar.

  • putVideo (): OpenCV görüntülerini besleyebileceğiniz bir sunucu başlatın. Bu, özel işlenmiş ve / veya açıklamalı görüntüleri kontrol paneline iletmenize olanak tanır.

cscore Kütüphanesi

Cscore kütüphanesi, aşağıdakilere daha düşük düzeyde uygulama sağlar:

  • USB ve HTTP (örneğin Axis) kameralardan görüntüler alın

  • Kamera ayarlarını değiştirin (ör. Kontrast ve parlaklık)

  • Kamera video modlarını değiştirin (piksel formatı, çözünürlük ve kare hızı)

  • Bir web sunucusu olarak hareket edin ve görüntüleri standart bir MJPEG akışı olarak sunun

  • Görüntü işleme için görüntüleri OpenCV Mat nesnelere / nesnelere dönüştürün

Kaynaklar ve Havuzlar

Cscore kütüphanesinin temel mimarisi, işlevsellik kaynaklar ve havuzlar arasında bölünmüş olarak MJPGStreamer ile benzerdir. Aynı anda oluşturulan ve çalışan birden çok kaynak ve birden çok havuz olabilir.

Görüntü üreten bir nesne bir kaynaktır ve görüntüleri kabul eden / tüketen bir nesne bir havuzdur. Üretme / tüketme, kütüphane perspektifindedir. Dolayısıyla kameralar birer kaynaktır (görüntü üretirler). MJPEG web sunucusu, programın içinden görüntüleri kabul ettiği için bir havuzdur (bu görüntüleri bir web tarayıcısına veya kontrol paneline iletiyor olsa bile). Kaynaklar birden fazla havuza bağlanabilir, ancak havuzlar bir ve yalnızca bir kaynağa bağlanabilir. Bir havuz bir kaynağa bağlandığında, cscore kitaplığı her bir görüntüyü kaynaktan havuza aktarmaya özen gösterir.

  • ** Kaynaklar **, ayrı kareleri (bir USB kamera tarafından sağlananlar gibi) alır ve yeni bir çerçeve mevcut olduğunda bir olayı tetikler. Belli bir kaynağı dinleyen havuzlar yoksa, işlemci ve G / Ç kaynaklarını kaydetmek için kitaplık duraklayabilir veya bir kaynaktan bağlantıyı kesebilir. Kütüphane, yalnızca olayların tetiklenmesini duraklatıp yeniden başlatarak kamera bağlantı kesmelerini / yeniden bağlantılarını özerk bir şekilde yönetir (örneğin, bir bağlantı kesilmesi yeni çerçevelerin olmaması, bir hata olmamasıyla sonuçlanır).

  • **Sinks-Havuzlar ** belirli bir kaynağın etkinliğini dinler, en son görüntüyü alır ve uygun formatta hedefine iletir. Kaynaklara benzer şekilde, belirli bir havuz etkin değilse (örneğin, HTTP sunucusu üzerinden yapılandırılmış bir MJPEG’e hiçbir istemci bağlı değilse), kitaplık, işlemci kaynaklarını korumak için işlemenin bazı kısımlarını devre dışı bırakabilir.

Kullanıcı kodu (bir FRC robot programında kullanılanlar gibi), OpenCV kaynağı ve havuz nesneleri aracılığıyla bir kaynak (bir kamera gibi işlenmiş çerçeveler sağlar) veya bir havuz (işlenmek üzere bir çerçeve alır) olarak işlev görebilir. Bu nedenle, bir kameradan görüntüleri alan ve işlenmiş görüntüleri sunan bir görüntü işleme hattı aşağıdaki grafiğe benzer:

Block diagram showing that a program can either sink or source from OpenCV.

Kaynakların bağlı birden fazla havuzu olabileceğinden, boru hattı dallara ayrılabilir. Örneğin, orijinal kamera görüntüsü, UsbCamera kaynağını CvSink’e ek olarak ikinci bir MjpegServer havuzuna bağlayarak da sunulabilir, bu da aşağıdaki grafikle sonuçlanır:

Block diagram of multiple sinks.

Kamera tarafından yeni bir görüntü yakalandığında, hem CvSink hem de MjpegServer [1] onu alır.

Yukarıdaki grafik, aşağıdaki CameraServer snippet’inin oluşturduğu şeydir:

import edu.wpi.first.cameraserver.CameraServer;
import edu.wpi.cscore.CvSink;
import edu.wpi.cscore.CvSource;

// Creates UsbCamera and MjpegServer [1] and connects them
CameraServer.startAutomaticCapture();

// Creates the CvSink and connects it to the UsbCamera
CvSink cvSink = CameraServer.getVideo();

// Creates the CvSource and MjpegServer [2] and connects them
CvSource outputStream = CameraServer.putVideo("Blur", 640, 480);
#include "cameraserver/CameraServer.h"

// Creates UsbCamera and MjpegServer [1] and connects them
frc::CameraServer::StartAutomaticCapture();

// Creates the CvSink and connects it to the UsbCamera
cs::CvSink cvSink = frc::CameraServer::GetVideo();

// Creates the CvSource and MjpegServer [2] and connects them
cs::CvSource outputStream = frc::CameraServer::PutVideo("Blur", 640, 480);

CameraServer uygulaması, aşağıdakileri cscore düzeyinde etkin bir şekilde yapar (açıklama amacıyla). CameraServer, tüm cscore nesneleri için benzersiz adlar oluşturma ve bağlantı noktası numaralarını otomatik olarak seçme gibi birçok ayrıntıyla ilgilenir. CameraServer ayrıca, kapsam dışına çıktıklarında imha edilmemeleri için oluşturulan nesnelerin tek bir kaydını tutar.

import edu.wpi.cscore.CvSink;
import edu.wpi.cscore.CvSource;
import edu.wpi.cscore.MjpegServer;
import edu.wpi.cscore.UsbCamera;

// Creates UsbCamera and MjpegServer [1] and connects them
UsbCamera usbCamera = new UsbCamera("USB Camera 0", 0);
MjpegServer mjpegServer1 = new MjpegServer("serve_USB Camera 0", 1181);
mjpegServer1.setSource(usbCamera);

// Creates the CvSink and connects it to the UsbCamera
CvSink cvSink = new CvSink("opencv_USB Camera 0");
cvSink.setSource(usbCamera);

// Creates the CvSource and MjpegServer [2] and connects them
CvSource outputStream = new CvSource("Blur", PixelFormat.kMJPEG, 640, 480, 30);
MjpegServer mjpegServer2 = new MjpegServer("serve_Blur", 1182);
mjpegServer2.setSource(outputStream);
#include "cscore_oo.h"

// Creates UsbCamera and MjpegServer [1] and connects them
cs::UsbCamera usbCamera("USB Camera 0", 0);
cs::MjpegServer mjpegServer1("serve_USB Camera 0", 1181);
mjpegServer1.SetSource(usbCamera);

// Creates the CvSink and connects it to the UsbCamera
cs::CvSink cvSink("opencv_USB Camera 0");
cvSink.SetSource(usbCamera);

// Creates the CvSource and MjpegServer [2] and connects them
cs::CvSource outputStream("Blur", cs::PixelFormat::kMJPEG, 640, 480, 30);
cs::MjpegServer mjpegServer2("serve_Blur", 1182);
mjpegServer2.SetSource(outputStream);

Referans Sayma

Tüm cscore nesneleri dahili olarak referans olarak sayılır. Bir havuzun bir kaynağa bağlanması, kaynağın referans sayısını artırır, bu nedenle yalnızca havuzun kapsamda tutulması kesinlikle gereklidir. CameraServer sınıfı, CameraServer işlevleriyle oluşturulan tüm nesnelerin kaydını tutar, bu nedenle bu şekilde oluşturulan kaynaklar ve havuzlar hiçbir zaman kapsam dışına çıkmaz (açıkça kaldırılmadıkça).