**OpenCV Mobil (Android ve iOS)** ---------------------------------- OpenCV, Android ve iOS platformlarını resmi olarak destekler. Bu bölümde her iki platform için kurulum ve temel kullanım anlatılmaktadır. ## Android ### Kurulum 1. [opencv.org/releases](https://opencv.org/releases/) adresinden "Android" paketini indir 2. Zip dosyasını çıkart (örneğin `OpenCV-4.9.0-android-sdk/`) 3. Android Studio'da: `File → New → Import Module` 4. `OpenCV-4.9.0-android-sdk/sdk/` klasörünü seç 5. `app/build.gradle` dosyasına bağımlılık ekle: ```groovy dependencies { implementation project(':sdk') } ``` ### OpenCV'yi Başlat `MainActivity.java` içinde OpenCV'yi asenkron yükle: ```java import org.opencv.android.OpenCVLoader; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final String TAG = "OpenCV"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (OpenCVLoader.initLocal()) { Log.i(TAG, "OpenCV başarıyla yüklendi."); } else { Log.e(TAG, "OpenCV yüklenemedi!"); } } } ``` ### Kamera Görüntüsünü İşle (CameraBridgeViewBase) ```java import org.opencv.android.CameraBridgeViewBase; import org.opencv.core.Mat; public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 { private CameraBridgeViewBase mCameraView; @Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { Mat rgba = inputFrame.rgba(); // Gri tonlamaya çevir Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGBA2GRAY); Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_GRAY2RGBA); return rgba; } @Override public void onCameraViewStarted(int width, int height) {} @Override public void onCameraViewStopped() {} } ``` `activity_main.xml` içinde kamera görünümü: ```xml ``` ### TFLite Modeli ile Gerçek Zamanlı Tespit (Android) ```java import org.tensorflow.lite.Interpreter; // assets/ klasörüne model.tflite koy Interpreter tflite = new Interpreter(loadModelFile("model.tflite")); float[][][][] input = new float[1][224][224][3]; // ... görüntüyü input array'e doldur float[][] output = new float[1][1000]; tflite.run(input, output); int predClass = argmax(output[0]); ``` ### AndroidManifest İzinleri ```xml ``` --- ## iOS ### Kurulum (CocoaPods) ```ruby # Podfile platform :ios, '12.0' target 'MyApp' do pod 'OpenCV', '~> 4.9.0' end ``` ```bash pod install # .xcworkspace dosyasını aç ``` ### Kurulum (Swift Package Manager) Xcode'da: `File → Add Package Dependencies` → `https://github.com/opencv/opencv` URL'sini gir. ### Temel Kullanım (Swift + Objective-C Bridge) Swift projesinde OpenCV kullanmak için Objective-C bridge header gerekir. `OpenCVWrapper.h`: ```objc #import #import @interface OpenCVWrapper : NSObject + (UIImage *)toGrayscale:(UIImage *)image; @end ``` `OpenCVWrapper.mm`: ```objc #import "OpenCVWrapper.h" #import #import @implementation OpenCVWrapper + (UIImage *)toGrayscale:(UIImage *)image { cv::Mat mat; UIImageToMat(image, mat); cv::cvtColor(mat, mat, cv::COLOR_BGR2GRAY); cv::cvtColor(mat, mat, cv::COLOR_GRAY2BGR); return MatToUIImage(mat); } @end ``` Swift'ten çağır: ```swift let grayImage = OpenCVWrapper.toGrayscale(originalImage) imageView.image = grayImage ``` ### Kameradan Gerçek Zamanlı İşleme (iOS) ```swift import AVFoundation import UIKit class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } let ciImage = CIImage(cvPixelBuffer: pixelBuffer) let uiImage = UIImage(ciImage: ciImage) // OpenCV işlemi let processed = OpenCVWrapper.toGrayscale(uiImage) DispatchQueue.main.async { self.previewImageView.image = processed } } } ``` --- ## Performans İpuçları * Mobil cihazlarda `opencv-contrib` modülleri gereksiz yer kaplar; sadece gerekli modülleri derle * Kamera karesi işlemesi `main thread` dışında yapılmalıdır * `RGBA` yerine `BGR` formatı CPU'da daha hızlıdır; `RGBA2GRAY` tek adımda yapılabilir * Android'de `NativeCamera` (C++ JNI) Java kamerasına göre ~2x daha hızlıdır