C++ İLE GÖRÜNTÜ İŞLEME – Resim Dosyası Okumak
Herkese merhabalar. Yeni bir seriye başlıyoruz C++ ile görüntü işleme. Bu serimizde görüntü işleme algoritmalarını detaylı bir şekilde işleyip C++ ortamında kodlayacagız.
Bu seride, görüntü işleme konusunu yazılımsal olarak daha detaylı bir şekilde anlamak amaçlanmaktadır. C++ programlama dili düşük seviyeli olduğu için değişkenlerimizi tanımlayıp daha fazla kod yazılacaktır. Ayrıca nesneye yönelik programlama konularını kullanacağız. Bu durumda sınıf ve metotlar oluşturacağız.
Bu Serinin hem eğitici hem de rehber olması amacıyla diğer serilerden daha fazla alt içerik olmasına rağmen daha kısa olacaktır.
C++ arayüz programı olarak CodeBlocks, Dev C++, Visual Studio gibi arayüz programları (IDE) kullanılabilir.
İlk bölümde resim dosyasını okuma işlemini yapıyoruz.
Görüntü Dosyası Okumak
#include<iostream> #include<stdio.h> using namespace std; int main(){ return 0; }
Bu oluşturduğumuz projenin şablonudur. Burada kütüphaneleri yükledik ve ana fonksiyonumuzu oluşturduk.
#include<iostream> = C++ programlama dilinin ana kütüphanesidir ve cin, cout, cerr, ve clog nesnelerini içerir. Ayrica bu kütüphane bilgisayar ekranına birşeyler yazdırıp, programa klavye ile değer girilmesini sağlayan işlevleri barındırır.
#include<stdio.h> = stdio.h başlık dosyasında yer alan C standart giriş ve çıkış kütüphanesindeki fonksiyon, değişken, sabit ve diğer değerler içerir. Bu sistem tarafından desteklenen diğer dosya türleriyle çalışmak için kullanır.
using namespace std; ile std::cout, std::cin, std::endl gibi komutlar yerine direk cout, cin, endl yazabilmekteyiz
main fonksiyonun içine kodlarımızı yazacağız.
FILE *girisDosya = fopen("resim.bmp", "rb"); if (girisDosya == (FILE*)0) { cout << "Resim dosyasi bulunamiyor veya gecersiz." << endl; } else { cout << "Basari ile yuklendi" << endl; }
Bir dosyayı açmak ve bu dosyayı ilgili akışla birleştirmek için aşağıda prototipi verilen fopen() fonksiyonunu kullanmanız gerekir. fopen() fonksiyonuna argüman olarak geçirilen ve ‘wb’ ile gösterilen karakter dizisi ise dosyanın okuma şeklinde açılacağını belirler.
Eğer dosya açma işlemi başarılı olarak sonuçlanırsa, fopen() fonksiyonu geçerli bir dosya işaretçisi geri verir. FILE, stdio.h dosyası içinde tanımlanmış olup dosyanın boyutu, aktif konumu ve giriş modları gibi dosya hakkındaki değişik değerleri içeren bir yapı’dır.
Burada dikkat edilmesi gereken konu resim dosyasının .bmp uzantılı olması ve oluşturduğumuz proje ile aynı dosyada olmalıdır. Eğer aynı konumda değilse resim dosya yolu verilmelidir.
unsigned char bilgiDepo[54]; unsigned char piksels[1024];
Komutlar ile resim içerik bilgilerini yüklemek için 54 kapasiteli bilgiDepo dizisi, resim piksel değerlerini depolamak için 1024 kapasiteli piksels dizisi oluşturuyoruz.
unsigned komutu ile dizimizin maksimum 255 minimum 0 değerleri almasını sağlıyoruz.
for(int i = 0; i < 54; i++)<br> {<br> bilgiDepo[i] = getc(girisDosya);<br> }
Komutlar ile yüklediğimiz resim dosyasının içerik bilgilerini bilgiDepo dizisine aktarıyoruz. Dizinin kapasitesi 54 olduğu için for döngüsü ile depoluyoruz.
getc fonksiyonu karakter okuma işlemini yapar ve bellek değişkenine aktarır.
int genislik = *(int *)&bilgiDepo[18]; int uzunluk = *(int *)&bilgiDepo[22]; int bitDerinlik = *(int *)&bilgiDepo[28];
Komutlar ile bilgiDepo dizisinde tamsayı şeklinde genişlik, uzunluk, bitDerinlik gibi özellikleri alıyoruz. Burada dizimizin 18. sırasında resim genişlik değeri, 22. sırasında uzunluk değeri, 28. sırasında resmin bit değeri yer almaktadır. Bu değerleri oluşturduğumuz değişkenlere aktarıyoruz.
fclose(girisDosya);
fclose() fonksiyonu ile dosyamızı kapatıyoruz.
cout << "--------------------" << endl; cout << "Derinlik: " << bitDerinlik << endl; cout << "Genislik: " << genislik << endl; cout << "Uzunluk: " << uzunluk << endl; cout << "--------------------" << endl;
Komutlar ile resim içerik özelliklerini cout fonksiyonu ile bastırıyoruz ve endl fonksiyonu ile bastırıldıktan sonra alt satıra geeçilmesini sağlıyoruz.
C++ ile Görüntü işleme serimizin birinci bölümünde Resim dosyası okuma konusu anlatıldı. Serimizin sonraki bölümlerinde, diğer görüntü işleme algoritmaları anlatılacak ve uygulama gerçekleştirilecektir.
Tüm koda ulaşmak için:
https://github.com/enesdoruk/Image-Processing-with-C
Görüşmek dileğiyle.
Hocam aynı resimi jpg yapınca resım ıcın cıktılar aynı 8 512 512.. ama farklı jpg resım ıcın adres degerlerını yazıyor bunu nasıl duzeltririz ?
C++ ortamında resim dosyaları için bmp formatını kullanıyoruz. jpg formatı hata verebilir. bmp formatına çevirmeni öneririm.
Hocam, iyi günler. Bu kodda 18, 22, 28. elemanların doğru elemanlar olduğu kanaatine nasıl vardık?