├── .gitignore ├── Dosya İşlemleri ├── Fotoğraf │ ├── Makefile │ ├── main.cpp │ └── ornek.jpg ├── README.md ├── Video Kaydetme │ ├── Makefile │ ├── main.cpp │ └── ornek.mp4 └── Video Okuma │ ├── Makefile │ ├── main.cpp │ └── ornek.mp4 ├── Kamera ├── Fotoğraf │ ├── Makefile │ └── main.cpp ├── README.md └── Video │ ├── Makefile │ └── main.cpp ├── LICENSE ├── README.md ├── Temel ├── Boş Proje │ ├── Makefile │ └── main.cpp └── README.md ├── Çizim └── README.md └── İmaj İşlemleri └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /Dosya İşlemleri/Fotoğraf/Makefile: -------------------------------------------------------------------------------- 1 | derleme: 2 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs 3 | -------------------------------------------------------------------------------- /Dosya İşlemleri/Fotoğraf/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include "opencv2/highgui/highgui.hpp" 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main(int argc, char **argv) 9 | { 10 | Mat fotograf; 11 | 12 | // Bir resim dosyasını okuyup matrisimize aktaralım: 13 | fotograf = imread("./ornek.jpg"); 14 | 15 | // Dosyanın düzgün şekilde okunduğunu teyit edelim: 16 | if ( !fotograf.data ) 17 | { 18 | cerr << "Dosya bozuk veya okunamadı." << endl; 19 | return -1; 20 | } 21 | 22 | // İmajımızı yeni bir dosya olarak kaydedelim: 23 | imwrite("./yeniFotograf.jpg", fotograf); 24 | 25 | 26 | imshow("Dosyadan Okunan Fotograf", fotograf); 27 | waitKey(0); 28 | return 0; 29 | } -------------------------------------------------------------------------------- /Dosya İşlemleri/Fotoğraf/ornek.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eminfedar/opencv-cpp-rehber/259891248f13454a1a1c14f76371369c5a6c30fb/Dosya İşlemleri/Fotoğraf/ornek.jpg -------------------------------------------------------------------------------- /Dosya İşlemleri/README.md: -------------------------------------------------------------------------------- 1 | # / Dosya İşlemleri 2 | 3 | ## 1. OpenCV ile dosyadan fotoğraf okuma 4 | OpenCV ile dosyadan fotoğraf okumak için kullanılan fonksiyonumuz "Image Read"in kısaltılmış hali olan: `imread()` 5 | ```cpp 6 | Mat imread(const string& filename, int flags=1 ) 7 | ``` 8 | 9 | 1. Parametre `filename` olarak ilk parametresi okunacak dosyanın tam yolu. 10 | 11 | 2. Parametre `flags` ise okunacak imajın renk tipinin seçilmesi (Siyah beyaz olarak mı okunacak, renkli mi okunacak vs.) 12 | ```cpp 13 | CV_LOAD_IMAGE_UNCHANGED = -1 14 | // İmaj nasıl ise hiç değiştirmeden öyle oku. 15 | // Saydam kısımlara sahip fotoğraflar için bu bayrak kullanılmalı. 16 | 17 | CV_LOAD_IMAGE_GRAYSCALE = 0 18 | // (8 bit) İmaj renkli olsa bile siyah-beyaz olarak oku ve matrise yaz. 19 | 20 | CV_LOAD_IMAGE_COLOR = 1 21 | // (8 bit) (Varsayılan) İmaj renksiz olsa bile renkli olarak oku ve matrise yaz. 22 | 23 | CV_LOAD_IMAGE_ANYDEPTH = 2 24 | // Dosyanın bit derinliği ne ise öyle oku. 16 ise 16 bit, 32 ise 32 bit. 25 | ``` 26 | 27 | Fonksiyon geriye bir matris döndürür ve aşağıdaki şekilde kullanılabilir: 28 | ```cpp 29 | #include "opencv2/core/core.hpp" 30 | #include "opencv2/highgui/highgui.hpp" // imread 31 | 32 | Mat fotograf = imread("./ornek.png"); 33 | 34 | fotograf.data; // Saf piksel verileri. 35 | fotograf.cols; // Sütun sayısı, Genişlik. 36 | fotograf.rows; // Satır sayısı, Yükseklik. 37 | ``` 38 | 39 | ## 2. OpenCV ile işlenen fotoğrafı dosyaya kaydetme 40 | OpenCV ile işlenmiş bir matrisi dosyaya kaydetmek için "Image Write"ın kısaltılmış hali olan `imwrite()` fonksiyonu kullanılır: 41 | ```cpp 42 | bool imwrite(const string& filename, InputArray img, const vector& params=vector() ) 43 | ``` 44 | 1. Parametre `filename` yine dosyanın tam yolu. 45 | 2. Parametre `img` işlediğimiz matris nesnesi. 46 | 3. Parametre `params` dosyayı kaydettiğimiz formata göre gireceğimiz parametreler dizisi. *{Parametre1, Değer1, Parametre2, Değer2} şeklinde bir dizidir*.

Buna örnek olarak `.jpg` dosyası kaydederken dosyanın kalite yüzdesi *(örneğin %85)* veya `.png` dosyası ise sıkıştırma kalitesi *(örneğin 3 (0-9))* 47 | 48 | Fonksiyon aşağıdaki şekilde kullanılabilir: 49 | ```cpp 50 | #include "opencv2/core/core.hpp" 51 | #include "opencv2/highgui/highgui.hpp" // imread, imwrite 52 | 53 | Mat fotograf = imread("./ornek.png"); 54 | 55 | // 'fotograf' nesnesi ile işlemler ... 56 | 57 | imwrite("./yeniDosya.png", fotograf); 58 | ``` 59 | 60 | ## 3. OpenCV ile dosyadan video okuma 61 | OpenCV ile video kaydı okumak için kullandığımız sınıf [VideoCapture](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#videocapture) sınıfıdır. 62 | 63 | **VideoCapture** sınıfının üç tane yapıcı fonksiyonu (Constructor) vardır: 64 | ```cpp 65 | VideoCapture() 66 | VideoCapture(const string& filename) // Dosyadan video okumak için 67 | VideoCapture(int device) // Kameradan video okumak için 68 | ``` 69 | 70 | Bu yapıcı fonksiyonları kullanarak video dosyasını açabiliriz: 71 | ```cpp 72 | #include "opencv2/core/core.hpp" 73 | #include "opencv2/highgui/highgui.hpp" // VideoCapture 74 | 75 | 76 | VideoCapture videomuz("./videoDosyasi.mp4"); 77 | 78 | if ( !videomuz.isOpened() ) 79 | return -1; // Video verisi okunamadı 80 | ``` 81 | Veya [VideoCapture.open()](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-open) metodunu da kullanabiliriz: 82 | ```cpp 83 | VideoCapture videomuz; 84 | videomuz.open("./videoDosyasi.mp4"); 85 | ``` 86 | 87 | Daha sonra bu video karelerini tek tek fotoğraf gibi işleyebilmek için: 88 | ```cpp 89 | #include "opencv2/core/core.hpp" 90 | #include "opencv2/highgui/highgui.hpp" // VideoCapture, imshow 91 | 92 | 93 | VideoCapture videomuz("./videoDosyasi.mp4"); 94 | if ( !videomuz.isOpened() ) 95 | return -1; // Video verisi okunamadı 96 | 97 | 98 | Mat karemiz; 99 | while ( videomuz.read(karemiz) ) 100 | { 101 | // Ekranda gösterelim: 102 | imshow("Video Karesi:", karemiz); 103 | 104 | waitKey(100); // 100ms bekliyoruz. 105 | // Yaklaşık 10fpslik bir video gibi ekranda göreceğiz. 106 | } 107 | ``` 108 | 109 | *(Not: Video okuma/yazma için gerekli olan `-lopencv_videoio` kütüphanesini projenizi `g++` ile derlerken eklemeyi unutmayın!)* 110 | 111 | ## 4. OpenCV ile işlenen videoyu dosyaya kaydetme 112 | Yukarıdaki şekilde okuduğumuz video karelerini [VideoWriter](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter) sınıfını kullanarak yeni bir dosyaya yazabiliriz: 113 | ```cpp 114 | VideoWriter::VideoWriter() 115 | VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true) 116 | ``` 117 | 1. Parametre `filename` yazılacak dosyanın adı. 118 | 2. Parametre `fourcc` dosyanın hangi formatta kaydedileceği.
Kullanımı:
- MP4 için mp4v codeci kullanılabilir: `CV_FOURCC('m','p','4','v')`
*(tüm codeclere erişmek için: http://www.fourcc.org/codecs.php)* 119 | 3. Parametre `fps` videonun kaç kare/sn hızında olacağı. 120 | 4. Parametre `frameSize` dosya karelerinin çözünürlüğü *(örn: 1920x1080 için `Size(1920, 1080)`)* 121 | 5. Parametre `isColor` videonun renkli veya siyah-beyaz mı olacağı. *(varsayılan true, yani renkli)* 122 | 123 | 124 | **VideoWriter** sınıfı ile yukarıdaki şekilde okuduğumuz bir videoyu başka bir dosyaya kaydedelim: 125 | ```cpp 126 | #include "opencv2/core/core.hpp" 127 | #include "opencv2/highgui/highgui.hpp" // VideoCapture, VideoWriter 128 | 129 | VideoCapture video("./videoDosyasi.mp4"); 130 | if ( !video.isOpened() ) 131 | return -1; 132 | 133 | VideoWriter videoWriter("./yeniVideo.mp4", CV_FOURCC('m','p','4','v'), 25, Size(1280,720)); 134 | if ( !videoWriter.isOpened() ) 135 | return -1; // Dosya oluşturulamadı veya bir hata oluştu. 136 | 137 | 138 | Mat kare; 139 | while ( video.read(kare) ) 140 | { 141 | // Okunan kareyi yeni dosyaya yaz: 142 | videoWriter.write(kare); 143 | } 144 | ``` 145 | 146 | ## 5. Örnek projeler 147 | - [/ Dosya İşlemleri / Fotoğraf /](https://github.com/eminfedar/opencv-ornekler/tree/master/Dosya%20%C4%B0%C5%9Flemleri/Foto%C4%9Fraf) 148 | - [/ Dosya İşlemleri / Video Okuma /](https://github.com/eminfedar/opencv-ornekler/tree/master/Dosya%20%C4%B0%C5%9Flemleri/Video%20Kaydetme) 149 | - [/ Dosya İşlemleri / Video Kaydetme /](https://github.com/eminfedar/opencv-ornekler/tree/master/Dosya%20%C4%B0%C5%9Flemleri/Video%20Okuma) 150 | 151 | *(Not: Klasörlerin içinde terminali açıp `make` komutunu çalıştırarak projeyi derleyebilirsiniz.)* 152 | -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Kaydetme/Makefile: -------------------------------------------------------------------------------- 1 | derleme: 2 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_videoio 3 | -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Kaydetme/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include "opencv2/highgui/highgui.hpp" 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main(int argc, char **argv) 9 | { 10 | VideoCapture video("./ornek.mp4"); 11 | if (!video.isOpened()) 12 | return -1; 13 | 14 | VideoWriter videoWriter("./yeniVideo.mp4", CV_FOURCC('m', 'p', '4', 'v'), 25, Size(326, 172)); 15 | if (!videoWriter.isOpened()) 16 | return -1; 17 | 18 | 19 | 20 | Mat kare; 21 | while ( video.read(kare) ) 22 | { 23 | // Okunan kareyi yeni dosyaya yaz: 24 | videoWriter.write(kare); 25 | } 26 | 27 | return 0; 28 | } -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Kaydetme/ornek.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eminfedar/opencv-cpp-rehber/259891248f13454a1a1c14f76371369c5a6c30fb/Dosya İşlemleri/Video Kaydetme/ornek.mp4 -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Okuma/Makefile: -------------------------------------------------------------------------------- 1 | derleme: 2 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_videoio 3 | -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Okuma/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include "opencv2/highgui/highgui.hpp" 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main(int argc, char **argv) 9 | { 10 | VideoCapture video("ornek.mp4"); 11 | if (!video.isOpened()) 12 | return -1; 13 | 14 | 15 | Mat kare; 16 | while ( video.read(kare) ) 17 | { 18 | // mesela ekranda gösterelim: 19 | imshow("Video Karesi:", kare); 20 | 21 | waitKey(40); // 40ms bekleyerek sonraki fotografi bastırıyoruz. 22 | } 23 | 24 | waitKey(); 25 | return 0; 26 | } -------------------------------------------------------------------------------- /Dosya İşlemleri/Video Okuma/ornek.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eminfedar/opencv-cpp-rehber/259891248f13454a1a1c14f76371369c5a6c30fb/Dosya İşlemleri/Video Okuma/ornek.mp4 -------------------------------------------------------------------------------- /Kamera/Fotoğraf/Makefile: -------------------------------------------------------------------------------- 1 | derle: 2 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_videoio -------------------------------------------------------------------------------- /Kamera/Fotoğraf/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include "opencv2/highgui/highgui.hpp" 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main(int argc, char **argv) 9 | { 10 | VideoCapture kamera(0); 11 | if (!kamera.isOpened()) 12 | return -1; 13 | 14 | Mat kare; 15 | while (kamera.read(kare)) 16 | { 17 | imshow("Fotoğraf çektim:", kare); 18 | 19 | if (waitKey() == 27) // Bir sonraki fotoğraf için tuş girdisi bekliyoruz. 20 | break; // ESC tuşu ise döngüden çıksın. 21 | } 22 | return 0; 23 | } 24 | -------------------------------------------------------------------------------- /Kamera/README.md: -------------------------------------------------------------------------------- 1 | # / Kamera 2 | 3 | ## 1. OpenCV ile kamerayı kullanarak fotoğraf çekme / kaydetme 4 | OpenCV ile Video Okuma yazımızda kullandığımız [VideoCapture](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=videocapture#videocapture) sınıfını yine kullanacağız, fakat bu sefer bir dosyayı değil, kamera cihazını açacağız. 5 | ```cpp 6 | VideoCapture kamera(0); // 0 sistemdeki ilk kamera cihazını açar 7 | VideoCapture kamera("/dev/video0"); // Yukarıdaki ile aynı işi yapar fakat sadece Linux için geçerlidir. 8 | ``` 9 | Öyleyse okuduğumuz kamera verisiyle bir fotoğraf çekip bunu kaydedelim: 10 | ```cpp 11 | VideoCapture kamera(0); 12 | if (!kamera.isOpened()) 13 | return -1; 14 | 15 | 16 | Mat kare; 17 | if( kamera.read(kare) ) 18 | { 19 | imwrite("./fotograf.jpg", kare); 20 | } 21 | 22 | ``` 23 | Eğer çektiğiniz fotoğraf veya videonun özelliklerini değiştirmek istiyorsanız, mesela çözünürlüğü, fps değeri, pozlama değeri vs. [VideoCapture.set()](https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-set) metodunu kullanabilirsiniz. 24 | ```cpp 25 | VideoCapture kamera(0); 26 | kamera.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 27 | kamera.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 28 | ``` 29 | 30 | ## 2. OpenCV ile kamerayı kullanarak video çekme / kaydetme 31 | Yine OpenCV ile Video Kaydetme yazımızdaki mantığı kullanacağız lakin bu sefer bir dosyadan okuyup başka bir dosyaya kaydetmek yerine kameradan okuyup dosyaya kaydedeceğiz. 32 | ```cpp 33 | VideoCapture kamera(0); 34 | if (!kamera.isOpened()) 35 | return -1; 36 | 37 | kamera.set(CV_CAP_PROP_FRAME_WIDTH, 640); 38 | kamera.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 39 | kamera.set(CV_CAP_PROP_FPS, 25); 40 | 41 | VideoWriter videoWriter("./yeniVideo.mp4", CV_FOURCC('m', 'p', '4', 'v'), 25, Size(640, 480)); 42 | if (!videoWriter.isOpened()) 43 | return -1; 44 | 45 | 46 | 47 | Mat kare; 48 | int sayac = 0; 49 | while ( kamera.read(kare) && sayac++ < 75 ) // 75 kare çekelim, 3 saniye: 50 | { 51 | // Okunan kareyi yeni dosyaya yaz: 52 | videoWriter.write(kare); 53 | } 54 | ``` 55 | 56 | ## 3. Örnek Projeler 57 | - [/ Kamera / Fotoğraf /](https://github.com/eminfedar/opencv-ornekler/tree/master/Kamera/Foto%C4%9Fraf) 58 | - [/ Kamera / Video /](https://github.com/eminfedar/opencv-ornekler/tree/master/Kamera/Video) 59 | 60 | *(Not: Klasörlerin içinde terminali açıp `make` komutunu çalıştırarak projeyi derleyebilirsiniz.)* -------------------------------------------------------------------------------- /Kamera/Video/Makefile: -------------------------------------------------------------------------------- 1 | derle: 2 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_videoio -------------------------------------------------------------------------------- /Kamera/Video/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include "opencv2/highgui/highgui.hpp" 3 | #include 4 | 5 | using namespace cv; 6 | using namespace std; 7 | 8 | int main(int argc, char **argv) 9 | { 10 | VideoCapture kamera(0); 11 | if (!kamera.isOpened()) 12 | return -1; 13 | 14 | kamera.set(CV_CAP_PROP_FRAME_WIDTH, 640); 15 | kamera.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 16 | kamera.set(CV_CAP_PROP_FPS, 25); 17 | 18 | VideoWriter videoWriter("./yeniVideo.mp4", CV_FOURCC('m', 'p', '4', 'v'), 25, Size(640, 480)); 19 | if (!videoWriter.isOpened()) 20 | return -1; 21 | 22 | Mat kare; 23 | int sayac = 0; 24 | while (kamera.read(kare) && sayac++ < 75) // 75 kare çekelim, 3 saniye. 25 | { 26 | // Okunan kareyi yeni dosyaya yaz: 27 | videoWriter.write(kare); 28 | } 29 | 30 | return 0; 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Emin Fedar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenCV 💓 C++ 2 | Hoşgeldiniz. 3 | 4 | 5 | 6 | Bu repoda C++ diliyle geliştirilmiş OpenCV uygulamaları kolayca derlenebilir basit örnekler ve beraberinde konu anlatımıyla birlikte bulunmaktadır. 7 | Her türlü hata bildirimi ve istek için [Issue](https://github.com/eminfedar/opencv-ornekler/issues), yeni örnekler eklemek veya katkıda bulunmak için [Pull Request](https://github.com/eminfedar/opencv-ornekler/pulls) açabilirsiniz. 8 | 9 | *(Not: Uygulamalar **Pardus, Ubuntu** gibi **GNU/Linux** sistemlerde derlenmek üzere hazırlanmıştır. Windows için de kodlar aynıdır, fakat kütüphanenin kurulumu ve derleme süreci farklılık gösterebilir.)* 10 | 11 | ## [/ Temel:](https://github.com/eminfedar/opencv-cpp-rehber/tree/master/Temel) 12 | - OpenCV kütüphanesinin kurulumu 13 | - OpenCV kütüphanesinin genel kullanımı 14 | - OpenCV kütüphanesinin projeye eklenmesi (dinamik kütüphane bağlantısı) 15 | - Örnek boş proje 16 | 17 | ## [/ Dosya işlemleri:](https://github.com/eminfedar/opencv-cpp-rehber/tree/master/Dosya%20%C4%B0%C5%9Flemleri) 18 | - OpenCV ile dosyadan fotoğraf okuma 19 | - OpenCV ile işlenen fotoğrafı dosyaya kaydetme 20 | - OpenCV ile dosyadan video okuma 21 | - OpenCV ile işlenen videoyu dosyaya kaydetme 22 | - Örnek projeler 23 | 24 | ## [/ Kamera:](https://github.com/eminfedar/opencv-cpp-rehber/tree/master/Kamera) 25 | - OpenCV ile kamerayı kullanarak fotoğraf çekme / kaydetme 26 | - OpenCV ile kamerayı kullanarak video çekme / kaydetme 27 | - Örnek projeler 28 | 29 | ## [/ Çizim:](#) 30 | - OpenCV ile resme çizgi çizme 31 | - OpenCV ile resme dikdörtgen çizme 32 | - OpenCV ile resme çember çizme 33 | 34 | ## [/ İmaj işlemleri:](#) 35 | - OpenCV ile resmin üzerine başka bir resim ekleme 36 | - OpenCV ile resmi renk kanallarına ayırma 37 | - OpenCV ile resmi büyültme / küçütlme 38 | - OpenCV ile resmi istenen açıyla döndürme 39 | -------------------------------------------------------------------------------- /Temel/Boş Proje/Makefile: -------------------------------------------------------------------------------- 1 | derle: 2 | g++ main.cpp -lopencv_core -------------------------------------------------------------------------------- /Temel/Boş Proje/main.cpp: -------------------------------------------------------------------------------- 1 | #include "opencv2/core/core.hpp" 2 | #include 3 | 4 | using namespace cv; 5 | using namespace std; 6 | 7 | int main(int argc, char **argv) 8 | { 9 | Mat resim1 = Mat::ones(2, 4, CV_8UC1); 10 | Mat resim2 = Mat::ones(2, 4, CV_8UC1); 11 | 12 | resim1 = resim1 + resim2; 13 | cout << resim1 << endl; 14 | 15 | return 0; 16 | } -------------------------------------------------------------------------------- /Temel/README.md: -------------------------------------------------------------------------------- 1 | # / Temel 2 | ## 1. OpenCV kütüphanesinin kurulumu 3 | Debian tabanlı paket yöneticisi kullanan linux sistemler için (Pardus/Ubuntu/Debian/Kali vs.): 4 | ```bash 5 | sudo apt install libopencv-dev 6 | ``` 7 | Bu şekilde sisteminize dağıtımınızın depolarındaki OpenCV kütüphanesini yükleyebilir ve daha sonra uygulamalarınızda bu kütüphaneye bağımlı hale getirerek kullanabilirsiniz. 8 | 9 | *(yani programınızın içine OpenCV'yi gömmek yerine kullanıcıdan bu kütüphaneyi sistemine kurmasını şart koşarak. Son kullanıcı geliştirici dosyalarını içeren `libopencv-dev` paketini değil, kütüphanenin kullanım için derlenmiş paketini kurmalıdır. (`libopencv-core3.2` gibi))* 10 | 11 | ## 2. OpenCV kütüphanesinin genel kullanımı 12 | OpenCV kütüphanesini C++ projemize basit bir include satırıyla ekleyebiliyoruz. 13 | ```cpp 14 | #include "opencv2/core/core.hpp" 15 | ``` 16 | Eklediğimiz kütüphane bize OpenCV'nin temel veri tiplerini ve fonksiyonları sağlıyor. 17 | 18 | ### Bunlardan ileride sıkça kullanacağımız birkaçı: 19 | *(📖 Tüm Liste: https://docs.opencv.org/2.4/modules/core/doc/core.html)* 20 | 21 | Veri Tipleri: 22 | - [Mat](https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat) (2+ Boyutlu Matris) (Resim verisini tutacağımız değişken tipi) 23 | - [Vec](https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#vec) (1 Boyutlu Vektör, yani Dizi) (Resmin tek bir pikselinin verisini *(Mavi, Yeşil, Kırmızı)* tutacağımız değişken veri tipi.) 24 | - `Vec` bir taslak sınıftır. Genelde onun yerine `Vec3b` kullanırız.
`Vec3b` aslında `Vec` demektir. Yani 8 bitlik 3 tane veri tutan bir vektör (yani dizi).
Eğer 3 tane 8 bit değil de, 3 tane 32 bit (yani int) tutmak isterseniz `Vec3i` veya `Vec` kullanabilirsiniz. 25 | - ... 26 | 27 | Fonksiyonlar: 28 | - [merge()](https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat) (İki resim matrisini birleştirme, veya iki farklı kanalı) 29 | - [split()](https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#vec) (Resmi kanallarına ayırma) 30 | - [line()](https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#line) (Resim üzerine çizgi çizme) 31 | - [putText()](https://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html#puttext) (Resim üzerine yazı yazma) 32 | - [clone()](https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-clone) (Resim matrisinin bir ayrı kopyasını oluşturma) 33 | - ... 34 | 35 | ### Birkaç kod örneği verelim: 36 | ```cpp 37 | Mat resim; // tutacağımız resim verisi için bir matris oluşturduk. 38 | resim.create(3,5, CV_8UC1); 39 | // Matrisimizin genişiği 3, yüksekliği 5, matris dizisinin içinde tuttuğu verinin tipi ise işaretsiz 8 bitlik veri (8U), kanal sayısının da 1 kanal olduğunu(C1) belirttik. 40 | // Bu şekilde siyah beyaz tonlarda bir resim tutabiliriz, veya sadece tek bir kanal(örneğin kırmızı) renklere sahip bir resim tutabiliriz. 41 | 42 | 43 | resim.create(3,5, CV_8UC3); 44 | // Eğer komple renkli bir resim tutmak istiyorsak kullanacağımız matrisin piksel verisi CV_8UC3 olmalı. ( yani 8 bitlik 3 kanal (B,G,R) ) 45 | ``` 46 | Tabi genelde fotoğraflar ve video kareleri ile çalıştığımız için matrislerimizi elle oluşturmak zorunda kalmayız çünkü fotoğraf okuyucu fonksiyonlar bizim için bunu halleder. 47 | 48 | Ayrıca eğer ihtiyaç duyarsak matris oluşturmayı tek satırda da halledebiliriz (genel kullanım böyledir): 49 | ```cpp 50 | Mat resimMatrisi(10, 10, CV_8UC3); 51 | ``` 52 | 53 | ### Başlangıç için küçük ama mühim detaylar: 54 | - OpenCV'nin sunduğu veri tipleri referans bazlı çalışır. 55 | 🤔 56 | 57 | Peki bu ne demek? Örneğin: 58 | ```cpp 59 | int a = 5; 60 | int b = a; 61 | a = 10; 62 | 63 | cout << a; // 10 64 | cout << b; // 5 65 | ``` 66 | Bu kod parçası **değer bazlı** çalışma örneğidir. Yani bir değişkeni diğer bir değişkene eşitlediğinizde sadece onun değeri diğerine aktarılır. 67 | 68 | Referans bazlı çalışmada ise bir değişken diğerine eşitlendiğinde ikisi de aynı veri üzerinde çalışır: 69 | ```cpp 70 | Mat A = Mat::ones(3, 4, CV_8UC1); // bütün elemanları 1 olan matris oluşturur 71 | Mat B = A; 72 | 73 | B = B * 5; 74 | cout << A << endl; 75 | /* 76 | [5, 5, 5, 5; 77 | 5, 5, 5, 5; 78 | 5, 5, 5, 5] 79 | */ 80 | cout << B << endl; 81 | /* 82 | [5, 5, 5, 5; 83 | 5, 5, 5, 5; 84 | 5, 5, 5, 5] 85 | */ 86 | ``` 87 | Gördüğünüz gibi B A'ya eşitlendiğinde A'daki verinin tutulduğu adres B'deki verinin tutulduğu adrese eşitlenir. Böylece ikisi de **aynı adresteki veriyi** değiştirir, okur, yazar. 88 | 89 | Eğer amacınız bu değil ve her biri kendi verisini kendi kontrol eden iki matris elde etmek ise, yukarıda da belirttiğimiz `copyTo()` veya `clone()` fonksiyonlarını kullanabiliriz: 90 | ```cpp 91 | Mat A = Mat::ones(3, 4, CV_8UC1); 92 | Mat B; 93 | 94 | A.copyTo(B); // A'nın içeriğini B'ye kopyala 95 | B = A.clone(); // A'dan yeni bir klon oluşturup B'ye eşitle 96 | 97 | // İki metottan dilediğinizi kullanabilirsiniz. 98 | // Sonuç olarak verileri aynı ama birbirinden bağımsız iki matrisiniz olur. 99 | 100 | B = B * 5; 101 | cout << A << endl; 102 | /* 103 | [1, 1, 1, 1; 104 | 1, 1, 1, 1; 105 | 1, 1, 1, 1] 106 | */ 107 | cout << B << endl; 108 | /* 109 | [5, 5, 5, 5; 110 | 5, 5, 5, 5; 111 | 5, 5, 5, 5] 112 | */ 113 | ``` 114 | 115 | ## 3. OpenCV kütüphanesinin projeye eklenmesi (dinamik kütüphane bağlantısı) 116 | OpenCV'yi projemize dinamik olarak eklediğimiz (yani tüm kaynak kodlarını içine gömmediğimiz) için, derleyiciyi de bundan haberdar etmemiz gerek. Yani derleyiciye kaynak kodları derlenmiş kütüphaneyi bizim projemize dahil etmesi gerektiğini söylemeliyiz. 117 | 118 | Bunun için `g++`'a `-l` etiketi ile projede kullandığımız kütüphaneleri eklemek yeterli olacaktır: 119 | ``` 120 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs 121 | ``` 122 | 123 | Eğer ileride daha fazla kütüphane kullanacak olursanız, mesela ekstra bir fonksiyonu kullanmak için opencv'nin `videostab.hpp` dosyasını da include ettiniz. Bu durumda derleyici komutuna sadece kullandığınız kütüphaneyi eklemeniz yeterli: 124 | ``` 125 | g++ main.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_videostab 126 | ``` 127 | 128 | ## 4. Örnek boş proje 129 | [/ Temel / Boş Proje /](https://github.com/eminfedar/opencv-ornekler/tree/master/Temel/Bo%C5%9F%20Proje) main.cpp : 130 | ```cpp 131 | #include "opencv2/core/core.hpp" 132 | #include 133 | 134 | using namespace cv; 135 | using namespace std; 136 | 137 | int main(int argc, char **argv) 138 | { 139 | Mat resim1 = Mat::ones(2, 4, CV_8UC1); 140 | Mat resim2 = Mat::ones(2, 4, CV_8UC1); 141 | 142 | resim1 = resim1 + resim2; 143 | 144 | cout << resim1 << endl; 145 | return 0; 146 | } 147 | ``` 148 | -------------------------------------------------------------------------------- /Çizim/README.md: -------------------------------------------------------------------------------- 1 | # OpenCV 💓 C++ 2 | Hoşgeldiniz. 3 | 4 | 5 | 6 | Bu repoda C++ diliyle geliştirilmiş OpenCV uygulamaları basit örnekler şeklinde sunulmaktadır. 7 | Her türlü hata bildirimi ve istek için [Issue](https://github.com/eminfedar/opencv-ornekler/issues), yeni örnekler eklemek ve katkıda bulunmak için [Pull Request](https://github.com/eminfedar/opencv-ornekler/pulls) açabilirsiniz. 8 | 9 | *(Not: Uygulamalar **Pardus, Ubuntu** gibi **GNU/Linux** sistemlerde ile derlenmek üzere hazırlanmıştır.)* 10 | 11 | ## Temel: 12 | - OpenCV kütüphanesinin genel kullanımı 13 | - OpenCV kütüphanesinin derleyiciye eklenmesi (dinamik kütüphane bağlantısı) 14 | 15 | ## Dosya işlemleri: 16 | - OpenCV ile dosyadan fotoğraf okuma 17 | - OpenCV ile işlenen fotoğrafı dosyaya kaydetme 18 | - OpenCV ile dosyadan video okuma 19 | - OpenCV ile işlenen videoyu dosyaya kaydetme 20 | 21 | ## Kamera: 22 | - OpenCV ile Kamerayı kullanarak fotoğraf çekme / kaydetme 23 | - OpenCV ile Kamerayı kullanarak video çekme / kaydetme 24 | 25 | ## Çizim: 26 | - OpenCV ile resme çizgi çizme 27 | - OpenCV ile resme dikdörtgen çizme 28 | - OpenCV ile resme çember çizme 29 | 30 | ## İmaj işlemleri: 31 | - OpenCV ile resmin üzerine başka bir resim ekleme 32 | - OpenCV ile resmi renk kanallarına ayırma 33 | - OpenCV ile resmi büyültme / küçütlme 34 | - OpenCV ile resmi istenen açıyla döndürme 35 | -------------------------------------------------------------------------------- /İmaj İşlemleri/README.md: -------------------------------------------------------------------------------- 1 | # OpenCV 💓 C++ 2 | Hoşgeldiniz. 3 | 4 | 5 | 6 | Bu repoda C++ diliyle geliştirilmiş OpenCV uygulamaları basit örnekler şeklinde sunulmaktadır. 7 | Her türlü hata bildirimi ve istek için [Issue](https://github.com/eminfedar/opencv-ornekler/issues), yeni örnekler eklemek ve katkıda bulunmak için [Pull Request](https://github.com/eminfedar/opencv-ornekler/pulls) açabilirsiniz. 8 | 9 | *(Not: Uygulamalar **Pardus, Ubuntu** gibi **GNU/Linux** sistemlerde ile derlenmek üzere hazırlanmıştır.)* 10 | 11 | ## Temel: 12 | - OpenCV kütüphanesinin genel kullanımı 13 | - OpenCV kütüphanesinin derleyiciye eklenmesi (dinamik kütüphane bağlantısı) 14 | 15 | ## Dosya işlemleri: 16 | - OpenCV ile dosyadan fotoğraf okuma 17 | - OpenCV ile işlenen fotoğrafı dosyaya kaydetme 18 | - OpenCV ile dosyadan video okuma 19 | - OpenCV ile işlenen videoyu dosyaya kaydetme 20 | 21 | ## Kamera: 22 | - OpenCV ile Kamerayı kullanarak fotoğraf çekme / kaydetme 23 | - OpenCV ile Kamerayı kullanarak video çekme / kaydetme 24 | 25 | ## Çizim: 26 | - OpenCV ile resme çizgi çizme 27 | - OpenCV ile resme dikdörtgen çizme 28 | - OpenCV ile resme çember çizme 29 | 30 | ## İmaj işlemleri: 31 | - OpenCV ile resmin üzerine başka bir resim ekleme 32 | - OpenCV ile resmi renk kanallarına ayırma 33 | - OpenCV ile resmi büyültme / küçütlme 34 | - OpenCV ile resmi istenen açıyla döndürme 35 | --------------------------------------------------------------------------------