Facebook RSS Feed
 
Kinect & Leap Motion: RGB Kamera Ayarları
Tarih: 17.09.2012, Platform: .NET 4.5, IDE: Visual Studio 2012, Level: 200

Kinect SDK 1.6 sürümünden itibaren RGB kamera görüntüsü üzerinde ışık ve renk optimizasyonu yapabiliyoruz. Bu özellik bize bir dijital kameranın sunduğu ışık, kontrast, gamma, sharpness ve pozlama süresi gibi bir çok ayarı değiştirmemize olanak sağlıyor. Yazımızda öncelikle kontrol edebildiğimiz görüntü ayarlarını inceleyeceğiz ve ardından ışık ve kontrast değerlerini değiştirebileceğimiz bir örnek uygulama üzerinde duracağız.

Öngereksinimler

Bu konuya başlamadan önce, Kinect ile renkli görüntü almayı biliyor olmanız yada RGB görüntüye ulaşım ile ilgili Kinect 102: RGB Görüntüye Ulaşım yazısını okumanız faydalı olacaktır.

Detaylar

Renkli görüntü üzerinde, bir dijital kemarada olmasını beklediğimiz bir çok ayarı kod tarafında uygulayabiliyoruz. Bu ayarları ve alabildikleri değerleri tabloda bulabilirsiniz.

Özellik Tür Varsayılan Değer En Düşük Değer En Yüksek Değer
Auto Exposure Bool True    
Exposure Time Double 0.0 0.0 4000
Auto White Balance Bool True    
Brightness Double 0.2156 0.0 1.0
Contrast Double 1.0 0.5 2.0
Frame Interval Double 0.0 0.0 4000
Gain Double 1.0 1.0 16.0
Gamma Double 2.2 1.0 2.8
Hue Double 0.0 -22.0 22.0
Saturation Double 1.0 0.0 2.0
Sharpness Double 0.5 0.0 1.0

Bu ayarların yanısıra;
Power Line Frequency'ye "Disabled", "Fifty Hertz" ve "Sixth Hertz" değerlerini;
Backlight Compensation Mode'a da "Average Brightness", "Center Only", "Center Priority" ve "Low Lights Priority" değerlerini atayabiliyoruz.

Sözü geçen bu ayarlara KinectSensor.ColorStream.CameraSettings altından ulaşılabiliyor.

Örnek Uygulama

2 Slider ile Brightness ve contrast ayarlarını kontrol edeceğimiz örnek bir uygulama geliştireceğiz. Visual Studio ile "KinectRGBKameraAyarlari" adında bir WPF uygulaması oluşturalım. Proje referanslarına "Microsoft.Kinect.dll" dosyasını ekleyelim.

Uygulamamız temel yapı olarak Kinect 102: RGB Görüntüye Ulaşım projesinin mantığıyla çalışacak.

[XAML] MainWindow.xaml

<Window x:Class="KinectRGBKameraAyarlari.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Kinect RGB Kamera Ayarları" Height="542" Width="640"
        WindowStartupLocation="CenterScreen" Loaded="Window_Loaded" Closing="Window_Closing">
    <Grid>
        <Image Name="imgColorFrame" Stretch="Uniform" Margin="0,0,0,35" />
        <TextBlock HorizontalAlignment="Left" Margin="10,0,0,10" TextWrapping="Wrap"
                   Text="Brightness:" Height="16" VerticalAlignment="Bottom"/>
        <Slider x:Name="sldBrightness" HorizontalAlignment="Left" Margin="75,0,0,7"
                Width="200" Height="18" VerticalAlignment="Bottom"
                ValueChanged="sldBrightness_ValueChanged" Minimum="0" Maximum="1" LargeChange="0.1"
                Value="0.2156" TickFrequency="0.1"/>
        <TextBlock HorizontalAlignment="Left" Margin="313,0,0,10" TextWrapping="Wrap"
                   Text="Contrast:" Height="16" VerticalAlignment="Bottom"/>
        <Slider x:Name="sldContrast" HorizontalAlignment="Left" Margin="367,0,0,7"
                Width="200" Height="18" VerticalAlignment="Bottom"
                ValueChanged="sldContrast_ValueChanged" Minimum="0.5" Maximum="2" LargeChange="0.1"
                TickFrequency="0.1" Value="1"/>
    </Grid>
</Window>

Kinect'in yakaladığı renkli görüntü, MainWindow üzerindeki image kontrolünde gösteriliyor. sldBrightness ve sldContrast Slider'larını, kontrol ettikleri ayarın en düşük ve yüksek değerleriyle sınırlandırıyoruz. Bu slider'ların changed event'lerinde, görüntüyü değiştirecek ayarları uygulayacağız.

-

[C#] MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;
 
namespace KinectRGBKameraAyarlari
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private KinectSensor kinect;
        private byte[] pixelData;
        private WriteableBitmap outputImage;
        private ColorImageFormat lastImageFormat = ColorImageFormat.Undefined;
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Kinect bağlıysa, belirtilen parametrelere göre ilk Kinect'i yapılandır ve başlat
            if (KinectSensor.KinectSensors.Count > 0)
            {
                kinect = KinectSensor.KinectSensors[0];
 
                kinect.Start();
 
                kinect.ColorStream.Enable
                    (ColorImageFormat.RgbResolution640x480Fps30);
 
                kinect.ColorFrameReady
                    += new EventHandler<ColorImageFrameReadyEventArgs>(Kinect_ColorFrameReady);
            }
 
            #region Kinect RGB Renk Ayarları
 
            // Auto Exposure. Varsayılan değer: True
            kinect.ColorStream.CameraSettings.AutoExposure = true;
 
            //  Exposure [0.0 ~ 4000]. Varsayılan değer: 0.0
            kinect.ColorStream.CameraSettings.ExposureTime = 1.0;
 
            // Auto White Balance. Varsayılan değer: True
            kinect.ColorStream.CameraSettings.AutoWhiteBalance = true;
 
            // White Balance [2700 ~ 6500]. Varsayılan değer: 2700 (Kelvin)
            kinect.ColorStream.CameraSettings.WhiteBalance = 2700;
 
            // Backlight Compensation Mode
            // [Average Brightness / Center Only / Center Priority / Lowlights Priority]
            // Varsayılan değer: Center Priority
            kinect.ColorStream.CameraSettings.BacklightCompensationMode
                = BacklightCompensationMode.CenterPriority;
 
            // Brightness [0.0 ~ 1.0]. Varsayılan değer: 0.2156
            kinect.ColorStream.CameraSettings.Brightness = 0.2156;
 
            // Contrast [0.5 ~ 2.0]. Varsayılan değer: 1.0
            kinect.ColorStream.CameraSettings.Contrast = 1.0;
 
            // Frame Interval [0 ~ 4000]. Varsayılan değer: 0.0
            kinect.ColorStream.CameraSettings.FrameInterval = 0.0;
 
            // Gain [1.0 ~ 16.0]. Varsayılan değer: 1.0
            kinect.ColorStream.CameraSettings.Gain = 1.0;
 
            // Gamma [1.0 ~ 2.8]. Varsayılan değer: 2.2
            kinect.ColorStream.CameraSettings.Gamma = 2.2;
 
            // Hue [-22.0 ~ 22.0]. Varsayılan değer: 0
            kinect.ColorStream.CameraSettings.Hue = 0.0;
 
            // Saturation [0.0 ~ 2.0]. Varsayılan değer: 1.0
            kinect.ColorStream.CameraSettings.Saturation = 1.00;
 
            // Sharpness [0.0 ~ 1.0]. Varsayılan değer: 0.5
            kinect.ColorStream.CameraSettings.Sharpness = 0.5;
 
            // Power Line Frequency [50Hz / 60Hz]. Varsayılan değer: Disabled
            kinect.ColorStream.CameraSettings.PowerLineFrequency = PowerLineFrequency.FiftyHertz;
 
            #endregion
        }
 
        private void Kinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            // Gelen görüntü bilgisini açıp imageFrame'e aktar
            using (ColorImageFrame imageFrame = e.OpenColorImageFrame())
            {
                // Görüntü varsa
                if (imageFrame != null)
                {
                    // Önceki görüntü biçimi ile yeni gelen görüntü biçimi farklı mı?
                    bool haveNewFormat = lastImageFormat != imageFrame.Format;
 
                    // Görüntü biçimi değiştiyse
                    if (haveNewFormat)
                    {
                        // Yeni görüntü boyutuna göre pixelData dizisini boyutlandır
                        pixelData = new byte[imageFrame.PixelDataLength];
                    }
 
                    // Görüntüyü pixelData dizisine aktar
                    imageFrame.CopyPixelDataTo(pixelData);
 
                    // Görüntü biçimi değiştiyse
                    if (haveNewFormat)
                    {
                        // Image elementinin kaynağı olarak gösterilen outputImage'ın
                        // özelliklerini değiştir
                        outputImage = new WriteableBitmap(
                            imageFrame.Width,  // Genişlik
                            imageFrame.Height, // Yükseklik
                            96,  // Yatay DPI
                            96,  // Dikey DPI
                            PixelFormats.Bgr32, // Piksel biçimi
                            null); // Bitmap paleti
 
                        // Image elementinin kaynağını outputImage olarak belirle
                        imgColorFrame.Source = outputImage;
                    }
 
                    // outputImage'ın içeriğini güncelle
                    outputImage.WritePixels(
                        new Int32Rect(0, 0, imageFrame.Width, imageFrame.Height),
                        pixelData,
                        imageFrame.Width * 4,
                        0);
 
                    // Bir sonraki görüntü biçimi karşılaştırması için, yeni görüntü
                    // biçimini kaydet
                    lastImageFormat = imageFrame.Format;
                }
            }
        }
 
        private void sldBrightness_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            // Brightness Slider'ının değerine göre aydınlık ayarını yap
            KinectSensor.KinectSensors[0].ColorStream.CameraSettings.Brightness = e.NewValue;
        }
 
        private void sldContrast_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            // Contrast Slider'ının değerine göre karşıtlık ayarını yap
            KinectSensor.KinectSensors[0].ColorStream.CameraSettings.Contrast = e.NewValue;
        }
 
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Kinect çalışıyorsa durdur
            if (kinect.IsRunning)
                kinect.Stop();
        }
    }
}

Uygulamayı çalıştırdığınızda alacağınız görüntü, Kinect'in varsyılan ayarlarına göre gelecektir. Slider'lar ile renk ayarlarını değiştirebilirsiniz. Diğer ayarları da benzer bir yöntem kullanarak değiştirebilirsiniz...


Ek Dosya: Uygulama Kodları
Okunma Sayısı: 1997

comments powered by Disqus
 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi