Videolardan alınan örneklerden oluşan görüntü dizilerinin birleştirilerek özet kare elde edilmesi basit bir işlem olmakla birlikte çeşitli ileri uygulamaların temeli olabilir. Fizikte bir eylemin özetlenmesi, örneğin belirli açılarla fırlatılan bir topun bu eğik atış hareketindeki yörüngesinin gözlenmesi görüntü dizisi birleştirme ile sağlanabilir. Daha sonraki aşamalarda görüntü dizilerinden hareket vektörleri çıkarılarak trafik yönünün ve akış hızının belirlenmesi gibi benzer uygulamalar yapılabilir. Ancak bu gibi uygulamalar bu çalışmanın kapsamında incelenmemiştir.
Bu çalışmada örnek sayısı arttıkça hareketlinin belirginliğinin azalması başlıca sorunlardan biri olmaktadır. Yaptığımız işlem içerik duyarlı olmayıp basit bir ortalama alma işlemi olduğundan böyle bir sonuç alınmıştır. Gelişen görüntü işleme teknikleri artık içerik duyarlı işlemlere olanak sağlamaktadır. Eğer hareketli nesneyi arka plandan ayırıp, birleştirme sırasında da hareketliye daha yüksek bir katsayı, arka plana daha düşük bir katsayı verebilirsek hareketlinin belirginleşmesini sağlayabiliriz.
Not: “MATLAB veya OpenCV ile birkaç satır kod ile yazılabilecek böylesine basit bir programı sade C ile yazmanızın sebebi nedir, olayı abartmanın ne alemi var?” gibi bir soru akıllara gelebilir.
Cevap: Ders Projesinde C dilini kullanmamız isteniyordu, özel bir sebebi yok
Işıkdoğan, Furkan, ve Zafer Sercan. “Resim Dizisi Birleştirme.” Programa Dilleri I Ders Projesi. Yıldız Teknik Üniversitesi, 8 Ocak 2010
Kaynak kodlar:
#include
#include
#include
unsigned char **dizi;
unsigned int offset,num_of_images;
unsigned long ht,wt;
char dizinadi[20],dosyaadi[40];
void baslikoku(char *dosyaadi)
{
FILE *in;
unsigned char ch[40];
short i;
in=fopen(dosyaadi,"rb");
/* 14-byte bmp dosya başlığı. */
i=0;
while (i<14) {
fscanf(in,"%c",&ch[i]);
i++;
}
offset=(int)ch[11]*256+(int)ch[10];
/*görüntü piksellerinin başladığı yerin offseti
birden fazla byte la ifade edilen değerin sayısal karşılığını yüksek değerli byte'ı 256 ile çarparak elde ettik*/
/* 40-byte resim başlığı */
i=0;
while (i<40) {
fscanf(in,"%c",&ch[i]);
i++;
}
/*Yükseklik ve genişlik bilgileri de offset değerinde olduğu gibi ilgili header bytelarından elde edildi*/
wt=(long)ch[6]*65536+(long)ch[5]*256+(long)ch[4];
ht=(long)ch[10]*65536+(long)ch[9]*256+(long)ch[8];
printf("Goruntu Cozunurlugu: %d * %d\n",wt, ht);
/*resmin tutulacağı 2 boyutlu matrise dinamik olarak yer açılması*/
dizi=(unsigned char**)malloc(ht * sizeof(unsigned char *));
for(i = 0; i < ht+1; i++)
dizi[i] = (unsigned char *)malloc(wt * sizeof(unsigned char));
fclose(in);
}
void out_bmp_olustur()
{
FILE *fsource, *fdest;
char source[MAX_PATH], dest[MAX_PATH];
int ch;
strcpy(dosyaadi,dizinadi);
strcat(dosyaadi,"\\1.bmp"); //Oluşturulacak dosyada ilk karenin header bilgileri kullanıldı
fsource = fopen(dosyaadi, "rb");
fdest = fopen("out.bmp", "wb");
while ((ch = fgetc(fsource)) != EOF)
fputc(ch, fdest);
fclose(fsource);
fclose(fdest);
}
void oku(char *dosyaadi)
{
FILE *in;
unsigned char p_ch;
unsigned int k,i;
/* Dosyayı aç */
in=fopen(dosyaadi,"rb");
fseek(in,offset,SEEK_SET); /* Header bilgilerinin bitimine git */
/* resmi satır satır oku */
for (i=1; i<=ht; i++) {
for (k=1; k<=wt; k++) {
fread(&p_ch,1,1,in);
dizi[i][k]+=p_ch/num_of_images; //ortalama kareye mevcut karenin 1/nlik bir ağırlıkla eklenmesi
}
}
fclose(in);
}
void yaz(char *dosyaadi)
{
unsigned int k,i;
unsigned char pixelyazilan;
FILE *out;
out=fopen(dosyaadi,"rb+");
fseek(out,offset,SEEK_SET); /* Header bilgilerinin bitimine git */
for (i=1; i<=ht; i++) {
for (k=1; k<=wt; k++) { /*Diziyi satır satır dosyaya yaz*/
pixelyazilan=(unsigned char)dizi[i][k];
fwrite(&pixelyazilan,1,1,out);
}
}
fclose(out);
}
int main()
{
unsigned int k,i;
char uzanti[5];
printf("Goruntulerin bulundugu dizinin adini giriniz: ");
scanf("%s",dizinadi);
printf("\nOrneklenen goruntu sayisini giriniz: ");
scanf("%u",&num_of_images);
strcpy(dosyaadi,dizinadi);
strcat(dosyaadi,"\\1.bmp");
baslikoku(dosyaadi);
/*Ortalama karenin hesaplanacağı iki boyutlu dizinin sıfırlanması*/
for (i=1; i<=ht; i++) {
for (k=1; k<=wt; k++) {
dizi[i][k]=0;
}
}
for (i=1; i<=num_of_images; i++){
strcpy(dosyaadi,dizinadi);
strcat(dosyaadi,"\\");
itoa(i,uzanti,10);
strcat(uzanti,".bmp");
strcat(dosyaadi,uzanti);
printf("islenen dosya:%s\n",dosyaadi);
oku(dosyaadi);
};
out_bmp_olustur();
yaz("out.bmp");
return 0;
}









