OpenCV (C++) Kütüphanesinin (Extra Modülü - Contrib ile) Windows'a Kurulumu ve Qt ile Kullanılması
OpenCV (Open Source Computer Vision Library) açık kaynak kodlu Bilgisayarla Görme kütüphanesidir. Hem akademik hem de ticari amaç için kullanımı ücretsizdir. C++, Python ve Java programlama dilleriyle Windows, Linux, Mac OS, iOS ve Android işletim sistemlerinde kullanılabilmektedir. OpenCV ile görüntü işleme (image processing), makine öğrenmesi (machine learning), bilgisayarla görme (computer vision), derin öğrenme (deep learning) alanlarında algoritma, uygulama geliştirebilirsiniz. Bunun için OpenCV size çok sayıda algoritmayı fonksiyon şeklinde kullanmanızı sağlayan imkanlar sunmaktadır. Yapmanız gereken tek şey dökümanlardan ilgili fonksiyonun aldığı parametre ve girdileri doğru vererek sonuçlarını doğru bir şekilde almak. Burada OpenCV'nin C++ programlama dili ile kullanılması için yapılması gereken derleme işlemi (kurulum) gerçekleştirilecektir ve Qt ile kullanımından bahsedilecektir. Derleme için Cmake programından faydalanılacaktır ve Qt kurulumu ile birlikte gelen MinGW derleyicisi derleme işleminde kullanılacaktır. Windows'a Qt kurulumu için önceki yazımı inceleyebilirsiniz. Ayrıca bu kurulum (derleme) esnasında OpenCV'nin extra modülü olarak anılan contrib modülü de derleme işlemine dahil edilecektir. OpenCV contrib içerisinde yer alan modüllere buradan bakabilirsiniz.
Adım 1.
OpenCV kütüphanesinin sitesinde ki releases sayfasından istediğiniz versiyonunun "Sources" linkinde yer alan kaynak kodlarını indiriniz. Bu sayfada windows için derlenmiş (Win pack) paket de olmasına rağmen bilgisayarınızda bir takım uyumsuzluktan kaynaklanan problemlerle karşılaşmamak için kaynak kodlarını kullanarak bilgisayarımızla tam uyumlu olması için derleme işlemini kendimiz gerçekleştireceğiz. (Bu kurulum için OpenCV 3.4.3 versiyonu kullanılacaktır, aşağıdaki ekran görüntüsünden de göreceğiniz gibi aslında son versiyon olarak 4.0.0-alpha çıkmış bulunmaktadır ancak son çıkan versiyonlarda bir takım hatalar çıkmaktadır bu hatalar zamanla düzeltilerek daha kararlı bir hale geldikten sonra kullanılmasını tavsiye ederim.)
OpenCV kütüphanesinin sitesinde ki releases sayfasından istediğiniz versiyonunun "Sources" linkinde yer alan kaynak kodlarını indiriniz. Bu sayfada windows için derlenmiş (Win pack) paket de olmasına rağmen bilgisayarınızda bir takım uyumsuzluktan kaynaklanan problemlerle karşılaşmamak için kaynak kodlarını kullanarak bilgisayarımızla tam uyumlu olması için derleme işlemini kendimiz gerçekleştireceğiz. (Bu kurulum için OpenCV 3.4.3 versiyonu kullanılacaktır, aşağıdaki ekran görüntüsünden de göreceğiniz gibi aslında son versiyon olarak 4.0.0-alpha çıkmış bulunmaktadır ancak son çıkan versiyonlarda bir takım hatalar çıkmaktadır bu hatalar zamanla düzeltilerek daha kararlı bir hale geldikten sonra kullanılmasını tavsiye ederim.)
Adım 2.
İndirilen sıkıştırılmış dosya (opencv-3.4.3.zip) çıkarılır. opencv-3.4.3 klasörü içerisinde "source" ve "build" adında 2 yeni boş klasörler oluşturulur ve opencv-3.4.3 klasörü içerisinde yer alan diğer tüm dosyalar "source" klasörü içerisine taşınır.
İndirilen sıkıştırılmış dosya (opencv-3.4.3.zip) çıkarılır. opencv-3.4.3 klasörü içerisinde "source" ve "build" adında 2 yeni boş klasörler oluşturulur ve opencv-3.4.3 klasörü içerisinde yer alan diğer tüm dosyalar "source" klasörü içerisine taşınır.
Adım 3.
OpenCV ekstra modüllerinin yer aldığı Contrib dosyası github sayfasından indirilir. Burada dikkat etmeniz gereken nokta kurulumunu yapacağınız OpenCV versiyonuyla aynı versiyondaki contrib dosyasını indirmek olacaktır. Burada OpenCV-3.4.3 kurulumu yapacağımız için opencv_contrib-3.4.3 klasörü indirildi ve sıkıştırılmış dosya çıkartıldı.
OpenCV ekstra modüllerinin yer aldığı Contrib dosyası github sayfasından indirilir. Burada dikkat etmeniz gereken nokta kurulumunu yapacağınız OpenCV versiyonuyla aynı versiyondaki contrib dosyasını indirmek olacaktır. Burada OpenCV-3.4.3 kurulumu yapacağımız için opencv_contrib-3.4.3 klasörü indirildi ve sıkıştırılmış dosya çıkartıldı.
Adım 4.1.
Kurulum için cmake-gui'den faydalanacağız. Öncelikle sitesinden işletim sisteminizin 32 bit ya da 64 bit olmasına göre .zip uzantılı cmake dosyası indirilir.
Kurulum için cmake-gui'den faydalanacağız. Öncelikle sitesinden işletim sisteminizin 32 bit ya da 64 bit olmasına göre .zip uzantılı cmake dosyası indirilir.
Adım 4.2.
İndirilen sıkıştırılmış dosya (cmake-3.12.2-win64-x64.zip) çıkarılır.
İndirilen sıkıştırılmış dosya (cmake-3.12.2-win64-x64.zip) çıkarılır.
Adım 4.3.
Çıkartılan klasör içerisinde bulunan "bin" klasörünün içerisinde yer alan "cmake-gui.exe" çift tıklanarak açılır.
Çıkartılan klasör içerisinde bulunan "bin" klasörünün içerisinde yer alan "cmake-gui.exe" çift tıklanarak açılır.
Adım 5.
Ortam değişkenleri içerisinde yer alan "Path" değişkenine "cmake" ve Qt kurulumu ile birlikte gelen ve derleme için kullanacağımız "MinGW" derleyicisinin bulunduğu yollar tanımlanır.
Ortam değişkenleri içerisinde yer alan "Path" değişkenine "cmake" ve Qt kurulumu ile birlikte gelen ve derleme için kullanacağımız "MinGW" derleyicisinin bulunduğu yollar tanımlanır.
Adım 6.
ve aşağıda yer alan "Configure" butonuna basılır.
- "Where is the source code:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "source" klasörü "Browse Source ..." butonuna basılarak seçilir.
- "Where to build the binaries:" yazan bölümde opencv-3.4.3 klasöründe oluşturduğumuz "build" klasörü "Browse Build ..." butonuna basılarak seçilir.
ve aşağıda yer alan "Configure" butonuna basılır.
Adım 7.
(1. yol)
"Configure" butonuna bastıktan sonra yeni bir pencere açılacaktır. Bu pencerede derleme işlemi için kullanılacak derleyicinin seçilmesi istenmektedir. Ben daha önce bilgisayarıma Qt'nin MinGW derleyicisi ile kurulumunu yaptığım için burada yine tanımlı yerel (default native compiler) MinGW derleyicisini seçiyorum. Windows'a Qt Kurulumu için yazımı buradan inceleyebilirsiniz.
(1. yol)
"Configure" butonuna bastıktan sonra yeni bir pencere açılacaktır. Bu pencerede derleme işlemi için kullanılacak derleyicinin seçilmesi istenmektedir. Ben daha önce bilgisayarıma Qt'nin MinGW derleyicisi ile kurulumunu yaptığım için burada yine tanımlı yerel (default native compiler) MinGW derleyicisini seçiyorum. Windows'a Qt Kurulumu için yazımı buradan inceleyebilirsiniz.
(2.yol)
"Specify native compilers" seçeneği ile yerel derleyicilerinizi kendiniz belirleyebilirsiniz. Burada eğer Qt kurulumu yaptıysanız " Qt > Qt5.11.1 > Tools > mingw530_32 > bin " klasöründe yer alan gcc.exe C derleyicisi olarak g++.exe C++ derleyicisi olarak seçilebilir.
"Specify native compilers" seçeneği ile yerel derleyicilerinizi kendiniz belirleyebilirsiniz. Burada eğer Qt kurulumu yaptıysanız " Qt > Qt5.11.1 > Tools > mingw530_32 > bin " klasöründe yer alan gcc.exe C derleyicisi olarak g++.exe C++ derleyicisi olarak seçilebilir.
Adım 8.1.
Derleyiciyi seçtikten sonra konfigürasyon işlemi başlayacaktır. "Configuration done" mesajını görene kadar bekleyiniz. Konfigurasyon işlemi sırasında OpenCV kütüphanesi ile kullanılabilecek diğer araçların bilgisayarınızda kurulu olup olmadığına bakılır ve sonunda size bunlar hakkında bilgiler verir. Bu kısım aslında çok detaylı bilgiler içermektedir ve hepsini tek tek açıklamak mümkün değildir. Şu an konfigurasyona dahil edilmeyen ancak ileride OpenCV'nin bir modülünü kullanmak istediğinizde bir takım eksik araçlardan kaynaklanan hatalar aldıkça hangi araçlara nerede ne zaman ihtiyaç duyacağınızı daha iyi anlayacaksınız. Biz burada Qt ile kullanmak istediğimizden WITH_QT özelliğini aktif duruma getiriyoruz.
Derleyiciyi seçtikten sonra konfigürasyon işlemi başlayacaktır. "Configuration done" mesajını görene kadar bekleyiniz. Konfigurasyon işlemi sırasında OpenCV kütüphanesi ile kullanılabilecek diğer araçların bilgisayarınızda kurulu olup olmadığına bakılır ve sonunda size bunlar hakkında bilgiler verir. Bu kısım aslında çok detaylı bilgiler içermektedir ve hepsini tek tek açıklamak mümkün değildir. Şu an konfigurasyona dahil edilmeyen ancak ileride OpenCV'nin bir modülünü kullanmak istediğinizde bir takım eksik araçlardan kaynaklanan hatalar aldıkça hangi araçlara nerede ne zaman ihtiyaç duyacağınızı daha iyi anlayacaksınız. Biz burada Qt ile kullanmak istediğimizden WITH_QT özelliğini aktif duruma getiriyoruz.
Adım 8.2.
OpenCV'nin extra modüllerini (opencv contrib) yüklemek için OPENCV_EXTRA_MODULES_PATH özelliğinde indirmiş olduğumuz opencv_contrib-3.4.3 klasörü içerisinde yer alan modules klasörünün yolu tanımlanır.
OpenCV'nin extra modüllerini (opencv contrib) yüklemek için OPENCV_EXTRA_MODULES_PATH özelliğinde indirmiş olduğumuz opencv_contrib-3.4.3 klasörü içerisinde yer alan modules klasörünün yolu tanımlanır.
Adım 8.3.
Derleme işleminde (‘nullptr’ was not declared in this scope..) hatası almamak için ENABLE_CXX11 aktif duruma getirilir.
Derleme işleminde (‘nullptr’ was not declared in this scope..) hatası almamak için ENABLE_CXX11 aktif duruma getirilir.
Adım 8.4.
Derleme esnasında (... windres.exe: unknown option -- W ...) hatası almamak için ENABLE_PRECOMPILED_HEADERS özelliği kapatılır.
Derleme esnasında (... windres.exe: unknown option -- W ...) hatası almamak için ENABLE_PRECOMPILED_HEADERS özelliği kapatılır.
Adım 8.5.
Derleme sırasında (modules\videoio\src\cap_msmf.cpp) ile ilgili hata almamak için WITH_MSMF özelliği kapatılır.
Derleme sırasında (modules\videoio\src\cap_msmf.cpp) ile ilgili hata almamak için WITH_MSMF özelliği kapatılır.
Adım 8.6.
Derleme yapılırken (opencv/source/modules/videoio/src/cap_dshow.cpp dosyasında sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ) hatası almamak için ../opencv-3.4.3/source/modules/videoio/src/cap_dshow.cpp dosyasında #include "DShow.h" satırından önce #define NO_DSHOW_STRSAFE satırı eklenir.
Derleme yapılırken (opencv/source/modules/videoio/src/cap_dshow.cpp dosyasında sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ) hatası almamak için ../opencv-3.4.3/source/modules/videoio/src/cap_dshow.cpp dosyasında #include "DShow.h" satırından önce #define NO_DSHOW_STRSAFE satırı eklenir.
Adım 8.7.
Eğer tüm OpenCV modüllerini tek bir kütüphane şeklinde kullanmak istiyorsanız BUILD_opencv_world özelliğini seçmelisiniz. Bunun hem artısı hem de eksisi vardır. Avantajı tek tek her bir modülü eklemek yerine sadece tek bir modülü eklemenin daha kolay olmasıdır. Ancak kullanılmayacak olan bir çok modül koda eklenmiş olur hem de tüm modüller bir arada olduğu için dosya boyutu yüksektir. Derleme esnasında hata alma ihtimalini arttırdığı için ben bu özelliği kullanmayacağım. Şimdilik bu seçimler basit bir kurulum için yeterli. Siz ihtiyaç duyduğunuz araçları yükleyip ekleyip çıkarmakta özgürsünüz. Dediğim gibi bu ihtiyaçlar OpenCV kütüphanesini kullandıkça ortaya çıkacaktır. Bende bundan sonraki yazılarımda ihtiyaç duyduğum durumlarda bu konfigurasyonlarda yapılması gereken değişiklikleri belirtmeyi düşünüyorum.
Tüm bu işlemlerden sonra "Configure" butonuna birkez daha basılır "Configuring done" mesajını gördükten sonra "Generate" butonuna basılır.
Eğer tüm OpenCV modüllerini tek bir kütüphane şeklinde kullanmak istiyorsanız BUILD_opencv_world özelliğini seçmelisiniz. Bunun hem artısı hem de eksisi vardır. Avantajı tek tek her bir modülü eklemek yerine sadece tek bir modülü eklemenin daha kolay olmasıdır. Ancak kullanılmayacak olan bir çok modül koda eklenmiş olur hem de tüm modüller bir arada olduğu için dosya boyutu yüksektir. Derleme esnasında hata alma ihtimalini arttırdığı için ben bu özelliği kullanmayacağım. Şimdilik bu seçimler basit bir kurulum için yeterli. Siz ihtiyaç duyduğunuz araçları yükleyip ekleyip çıkarmakta özgürsünüz. Dediğim gibi bu ihtiyaçlar OpenCV kütüphanesini kullandıkça ortaya çıkacaktır. Bende bundan sonraki yazılarımda ihtiyaç duyduğum durumlarda bu konfigurasyonlarda yapılması gereken değişiklikleri belirtmeyi düşünüyorum.
Tüm bu işlemlerden sonra "Configure" butonuna birkez daha basılır "Configuring done" mesajını gördükten sonra "Generate" butonuna basılır.
Not.
Derleme esnasında hata almamak için Adım 5'te belirtildiği gibi ortam değişkenlerine gerekli tanımlamaları eksiksiz yapmış olmanız gerekmektedir. Yoksa Qt'nin nerede kurulu olduğunu Cmake bulamaz ve hata verir. Qt path tanımlamaları aşağıdaki örnekte verildiği gibi otomatik bulunacaktır.
Derleme esnasında hata almamak için Adım 5'te belirtildiği gibi ortam değişkenlerine gerekli tanımlamaları eksiksiz yapmış olmanız gerekmektedir. Yoksa Qt'nin nerede kurulu olduğunu Cmake bulamaz ve hata verir. Qt path tanımlamaları aşağıdaki örnekte verildiği gibi otomatik bulunacaktır.
Adım 9.
Komut satır programı (cmd, terminal) açılır ve derleme işleminin gerçekleştirildiği "build" klasörüne geçilir.
Komut satır programı (cmd, terminal) açılır ve derleme işleminin gerçekleştirildiği "build" klasörüne geçilir.
mingw32-make
komutu çalıştırılır. Bu komutu hızlı derleme için mingw32-make -j4
formatında da yazabilirsiniz. Burada "-j4" ifadesiyle derleme esnasında bilgisayarın 4 çekirdeğininde kullanılması gerektiği belirtilir. Kullanılacak çekirdek sayısını arttırıp azaltabilirsiniz. Ancak bu şekilde birden fazla çekirdek kullanılarak derleme yapıldığında hata alınabilmektedir. Benim tavsiyem tek çekirdek ile derleme işlemini yapmanız.
Adım 10.
Hiç hata almadan 100% derleme işlemi başarılı bir şekilde yapıldıysa aşağıdaki komut çalıştırılır.
Hiç hata almadan 100% derleme işlemi başarılı bir şekilde yapıldıysa aşağıdaki komut çalıştırılır.
mingw32-make install
Bu aşamayla birlikte kurulumun başarılı bir şekilde yapılıp yapılmadığını anlamak için ../opencv-3.4.3/build/install/include klasörü kontrol edilir. Aşağıdaki ekran görüntülerinde gösterildiği gibi opencv2 klasörü içerisinde opencv modüllerini görmemiz gerekir.
Adım 11.
Bu aşamada OpenCV'nin Qt ile kullanılmasından bahsedilecektir. ../opencv-3.4.3/build/install/x86/mingw/bin klasöründe ".dll" uzantılı derlenen opencv kütüphanelerinin Qt'de tanımlanması gerekmektedir. OpenCV'nin ekstra kütüphanelerini de derleme esnasında kullandığımızdan derlenen kütüphane sayısı bir hayli fazladır. Qt'de OpenCV kütüphanesini kullanmamız için 2 farklı yöntem mevcuttur.
Bu aşamada OpenCV'nin Qt ile kullanılmasından bahsedilecektir. ../opencv-3.4.3/build/install/x86/mingw/bin klasöründe ".dll" uzantılı derlenen opencv kütüphanelerinin Qt'de tanımlanması gerekmektedir. OpenCV'nin ekstra kütüphanelerini de derleme esnasında kullandığımızdan derlenen kütüphane sayısı bir hayli fazladır. Qt'de OpenCV kütüphanesini kullanmamız için 2 farklı yöntem mevcuttur.
(1.yol)
Qt açılır sonra (.pro uzantılı) proje dosyası açılır ve aşağıda belirtildiği gibi OpenCV kütüphaneleri eklenir. Qt proje dosyasında (.pro) '\' simgesi bir alt satırdan devam et anlamında kullanılır. Klasör yolu tanımlanırken ya '/' simgesi ya da '\\' simgesi kullanılır. Ayrıca Qt proje dosyasında (.pro) kütüphane tanımlanırken -L(kütüphane yolu), -l(kütüphane) şeklinde önekleri kullanılmaktadır.
INCLUDEPATH += C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\include \
LIBS += -L"C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\x86\\mingw\\bin" \
libopencv_aruco343 \
libopencv_bgsegm343 \
libopencv_bioinspired343 \
libopencv_calib3d343 \
libopencv_ccalib343 \
libopencv_core343 \
libopencv_cvv343 \
libopencv_datasets343 \
libopencv_dnn_objdetect343 \
libopencv_dnn343 \
libopencv_dpm343 \
libopencv_face343 \
libopencv_features2d343 \
libopencv_flann343 \
libopencv_fuzzy343 \
libopencv_hfs343 \
libopencv_highgui343 \
libopencv_img_hash343 \
libopencv_imgcodecs343 \
libopencv_imgproc343 \
libopencv_line_descriptor343 \
libopencv_ml343 \
libopencv_objdetect343 \
libopencv_optflow343 \
libopencv_phase_unwrapping343 \
libopencv_photo343 \
libopencv_plot343 \
libopencv_reg343 \
libopencv_rgbd343 \
libopencv_saliency343 \
libopencv_shape343 \
libopencv_stereo343 \
libopencv_stitching343 \
libopencv_structured_light343 \
libopencv_superres343 \
libopencv_surface_matching343 \
libopencv_text343 \
libopencv_tracking343 \
libopencv_video343 \
libopencv_videoio343 \
libopencv_videostab343 \
libopencv_xfeatures2d343 \
libopencv_ximgproc343 \
libopencv_xobjdetect343 \
libopencv_xphoto343
Qt açılır sonra (.pro uzantılı) proje dosyası açılır ve aşağıda belirtildiği gibi OpenCV kütüphaneleri eklenir. Qt proje dosyasında (.pro) '\' simgesi bir alt satırdan devam et anlamında kullanılır. Klasör yolu tanımlanırken ya '/' simgesi ya da '\\' simgesi kullanılır. Ayrıca Qt proje dosyasında (.pro) kütüphane tanımlanırken -L(kütüphane yolu), -l(kütüphane) şeklinde önekleri kullanılmaktadır.
INCLUDEPATH += C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\include \
LIBS += -L"C:\\Users\\Eyyup\\Downloads\\opencv-3.4.3\\build\\install\\x86\\mingw\\bin" \
libopencv_aruco343 \
libopencv_bgsegm343 \
libopencv_bioinspired343 \
libopencv_calib3d343 \
libopencv_ccalib343 \
libopencv_core343 \
libopencv_cvv343 \
libopencv_datasets343 \
libopencv_dnn_objdetect343 \
libopencv_dnn343 \
libopencv_dpm343 \
libopencv_face343 \
libopencv_features2d343 \
libopencv_flann343 \
libopencv_fuzzy343 \
libopencv_hfs343 \
libopencv_highgui343 \
libopencv_img_hash343 \
libopencv_imgcodecs343 \
libopencv_imgproc343 \
libopencv_line_descriptor343 \
libopencv_ml343 \
libopencv_objdetect343 \
libopencv_optflow343 \
libopencv_phase_unwrapping343 \
libopencv_photo343 \
libopencv_plot343 \
libopencv_reg343 \
libopencv_rgbd343 \
libopencv_saliency343 \
libopencv_shape343 \
libopencv_stereo343 \
libopencv_stitching343 \
libopencv_structured_light343 \
libopencv_superres343 \
libopencv_surface_matching343 \
libopencv_text343 \
libopencv_tracking343 \
libopencv_video343 \
libopencv_videoio343 \
libopencv_videostab343 \
libopencv_xfeatures2d343 \
libopencv_ximgproc343 \
libopencv_xobjdetect343 \
libopencv_xphoto343
(2.yol)
Yukarıda anlatılan yöntemle proje dosyasına OpenCV kütüphanesinin derlendiği klasör yolunu tanımladığınızı ve bu şekilde onlarca proje oluşturduğunuzu düşünün. Yeni bir OpenCV versiyonu çıktığında ya da klasörü farklı bir yere taşıdığınızda oluşturduğunuz onlarca projeyi tek tek açarak bu tanımlamaları düzeltmeniz gerekecektir. Bu sıkıntılı durumu yaşamamak için yukarıda yapılan tanımlar bir text dosyası açılarak buraya yazılır. Daha sonra ".txt" olan dosya uzantısı ".pri" olarak değiştirilir ve bu dosya aşağıda tanımlandığı gibi Qt proje dosyasına (.pro) eklenir.
include(C:\Users\Eyyup\Downloads\opencv-3.4.3\opencv_library_path.pri)
Yukarıda anlatılan yöntemle proje dosyasına OpenCV kütüphanesinin derlendiği klasör yolunu tanımladığınızı ve bu şekilde onlarca proje oluşturduğunuzu düşünün. Yeni bir OpenCV versiyonu çıktığında ya da klasörü farklı bir yere taşıdığınızda oluşturduğunuz onlarca projeyi tek tek açarak bu tanımlamaları düzeltmeniz gerekecektir. Bu sıkıntılı durumu yaşamamak için yukarıda yapılan tanımlar bir text dosyası açılarak buraya yazılır. Daha sonra ".txt" olan dosya uzantısı ".pri" olarak değiştirilir ve bu dosya aşağıda tanımlandığı gibi Qt proje dosyasına (.pro) eklenir.
include(C:\Users\Eyyup\Downloads\opencv-3.4.3\opencv_library_path.pri)
elinize sağlık hocam Qt de tensorflow gelir mi
YanıtlaSilteşekkürler, yakın zamanda gelmez, doktoramı bitirmeye çalışıyorum bu tarz işlere vakit kalmıyor maalesef.
Sil