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;
.....
Kod: Tümünü seç
procedure TForm1.VarsayilaVideoOzellikleri;
begin
If VideoOzellikler = nil then
begin
VideoCapture1.VCapFilter.QueryInterface(IID_IAMVideoProcAmp, VideoOzellikler);
end;
end;
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;