IAMVideoProcAmp Arabirimi ya da WebCamın gamasını ayarlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

IAMVideoProcAmp Arabirimi ya da WebCamın gamasını ayarlama

Mesaj gönderen Akin_Delphi »

Arkadaşlar, Herkese merhabalar ve hayırlı işler.
Bu bir acemi olarak benim ilk mesajım. Forum kurallarını okudum ve tıpkı başka forumlarda olduğu gibi elimden geldiğince uymaya çalışacağım.

Öncelikle yapmaya çalıştığım şeyi açıklayayım:

Elimde bir web kamerası var. Bu kameranın gamma değerini DirectShow.pas'ın IAMVideoProcAmp arabirimi ile çevresel ışık (ambient light) düzeyine göre ayarlamaya çalışıyorum ve ayarlayabiliyorum da. Yani yapmaya çalıştığım şey web kamerasından alınan görüntünün parlaklığını ayarlamak. Gamma değeri kamerada 1 ila 5 arasında. 1 Yaptığımda en karanlık, 5 yaptığımda ise en aydınlık oluyor.

Sanırım (sanırım diyorum çünkü her ışık koşulu altında neyi ayarlamam gerektiğinden tam emin değilim) yapmaya çalıştığım şey aslında beyazlık dengesini / parlaklığı ayarlamak. Ve benimki de dahil çoğu kamera da bunu kendi kendine yapabiliyor. Sadece ben bunu özel koşullara göre (yani resim satırlarının ortalamasına göre) optimize etmeye çalışıyorum. Ancak problem şu ki, gama değerini 1 artırdığımda ya da azalttığımda, görüntü parlaklığı çok artıyor ya da azalıyor. Ayrıca görüntünün gaması diyelim ki sürekli 2 ila 3 ya da 3 ila 4 arasında gidip gidip geliyor.

Şimdi acaba beyaz dengesi / parlaklık ayarı nasıl yapılıyor. Yani kameralar bir referans değeri kullanıp parlaklığını / beyazlık dengesini ona göre mi ayarlıyorlar yoksa, dinamik olarak mı yapıyorlar.

Bir fikri olan var mı?

Bu arada kodu da paylaşayım belki birilerinin işine yarar :

Kod: Tümünü seç

uses .... DirectShow ....;

Kod: Tümünü seç

var //global olan değişken
....
VideoOzellikler: IAMVideoProcAmp;
.....
bu arabirimi elde etmek için aşağıdaki gibi bir prosedürüm var. Buradaki VideoCapture1, web cam, tv kartı vs. gibi görüntü kaynaklarından görüntü / ses alan, gerekirse yakalayan bir komponent.

Kod: Tümünü seç

procedure TForm1.VarsayilaVideoOzellikleri;
begin
If VideoOzellikler = nil then
begin
VideoCapture1.VCapFilter.QueryInterface(IID_IAMVideoProcAmp, VideoOzellikler);
end;
end;
bu arabirimi nasıl kullandığım

Kod: Tümünü seç

procedure TForm1.IsikDuzeyiAyarla;
Var
AralikAlt, AralikUst,
AdimDeltasi, VarsayilanDeger,
Deger : Integer;
CikisBayragi: TVideoProcAmpFlags;
begin
If ParlaklikEsigi = 0 then
begin
end;
If VideoOzellikler = nil then
begin
VarsayilaVideoOzellikleri;
end;
If VideoOzellikler <> nil then
begin
//önce aralık ve değeri al
VideoOzellikler.GetRange(VideoProcAmp_Gamma, AralikAlt, AralikUst, AdimDeltasi, VarsayilanDeger, CikisBayragi);
VideoOzellikler.Get(VideoProcAmp_Gamma, Deger, CikisBayragi);
//önce aralık ve değeri al SON
If ParlaklikEsigiEski = 0 then
begin
ParlaklikEsigiEski := ColorToRGB(SatirlarinOrtalamasi);
Exit;
end;
ParlaklikEsigi := SatirlarinOrtalamasi;
{$IFDEF HATAAYIKLA}
Color := ParlaklikEsigi;
{$ENDIF}
//önce aralık ve değeri al SON
    If ParlaklikEsigi < 1200000 then
    begin
      If Deger = AralikUst then
      begin
      Deger := AralikUst;
      end
      else If Deger < AralikUst then
      begin
      Deger := Deger + AdimDeltasi;
      end;
    //gamayı ayarla
    VideoOzellikler.Set_(VideoProcAmp_Gamma, Deger, CikisBayragi);
    //gamayı ayarla SON
    end;
    If ParlaklikEsigi > 2500000 then
    begin
      If Deger = AralikAlt then
      begin
      Deger := AralikAlt;
      end
      else If Deger > AralikAlt then
      begin
      Deger := Deger - AdimDeltasi;
      end;
    //gamayı ayarla
    VideoOzellikler.Set_(VideoProcAmp_Gamma, Deger, CikisBayragi);
    //gamayı ayarla SON      
    end;
  {$IFDEF HATAAYIKLA}
  OutputDebugString(PChar(Format('Deger:%d',[Deger])));
  OutputDebugString(PChar(Format('ParlaklikEsigi:%d',[ParlaklikEsigi])));
  OutputDebugString(PChar(Format('ParlaklikEsigiEski:%d',[ParlaklikEsigiEski])));
  OutputDebugString(PChar(Format('ParlaklikEsigiEski - ParlaklikEsigi:%d%',[(ParlaklikEsigiEski - ParlaklikEsigi)])));
  {$ENDIF}
  //parlaklık eşiğini tekrar belirle
  //ParlaklikEsigi := SatirlarinOrtalamasi;
  //parlaklık eşiğini tekrar belirle SON  
end;
end;
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

Yani yapmaya çalıştığım şey web kamerasından alınan görüntünün parlaklığını ayarlamak.
yanlış bilmiyorsam gamma correction parlaklık ayarı değildir
Gamma correction: Görüntü parlaklığında oluşan non-linear oluşumları linear renk-yoğunluğuna dönüştürmek. Görüntü renk -yoğunluğu CRT tipli Cathode Ray tüplü monitörlerde farklılık göstermekte Pixel' in parlaklığı değişen voltaj yoğunluğu ile doğru orantılı olarak değişmeli fakat pixelin parlaklığı ile voltaj değişimleri linear değildir.
gamma correction bellekteki görüntü üzerinde tam ters yönünde non-linear effekt etkisinde bulunarak voltaj ve brightness' ın linear olmasını sağlar
http://www.mutasyon.net/makaleoku.asp?id=76
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Mesaj gönderen Akin_Delphi »

Makaleyi inceledim ve çok yararlı ancak bana makale daha çok görüntü alımı değil de render edilmesiyle, yani oluşturulmasıyla ilgili gibi geldi. Yanılıyorsam kusura bakmayın.

Sanırım, kamera üreticileri bunu saklıyorlar gibi geliyor. Google'da yaptığım aramalarda yanlızca Philips kamerayla ilgili bir linux uygulaması gördüm. Onun dışında bu konuda çok bilgi yok.

Tabi dijital kameraların beyazlık ayarının (makine üzerinde) nasıl yapılacağına ilişkin bilgiler hariç. Saygılarımla.
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

Şöyle yap önce İrfanView ile bir resim dosyasını aç - bende bu program var o yüzden söylüyorum güzle programdır tavsiye ederim -
menüden Image->Enhance Colors seç
karşına çıkan ekrandan
Brightness
Contrast
Gamma Correction değerleriyle oyna ve orjinal resmle olan farkına bak
o zaman neyi değiştirmen gerektiğini görürsün (Brightness mı,
Contrast mı, Gamma Correction mi) ve ona göre araştırmanı yaparsın
kolay gelsin
Cevapla