কম্পিউটার টিউটোরিয়াল

Java OpenCV লাইব্রেরি ব্যবহার করে ইমেজ কন্টুর খুঁজে বের করার পদ্ধতি

কন্টুর হলো একটি নির্দিষ্ট আকৃতির বাউন্ডারি লাইন আঁকা যা সকল পয়েন্টকে জড়ে। এর ব্যবহার করে আপনি:

  • একটি অবজেক্টের আকৃতি খুঁজে পেতে পারেন।
  • একটি অবজেক্টের এলিয়া ক্যালকুলেট করতে পারেন।
  • একটি অবজেক্ট ডিটেক্ট করতে পারেন।
  • একটি অবজেক্ট রিকগনাইজ করতে পারেন।

আপনি findContours() মেথড ব্যবহার করে একটি ইমেজে বিভিন্ন আকৃতি, অবজেক্টের কন্টুর খুঁজে পেতে পারেন। এই মেথড নিচের প্যারামিটার গ্রহণ করে:

  • একটি বাইনারি ইমেজ।
  • MatOfPoint টাইপের একটি খালি লিস্ট অবজেক্ট কন্টুর স্টোর করতে।
  • ইমেজ টপোলজি স্টোর করার জন্য একটি খালি Mat অবজেক্ট।
  • দুটি ইন্টিজার ভেরিয়েবল দिये गये ইমেজের কন্টুর খুঁজার মোড এবং মেথড নির্দিষ্ট করতে।

উদাহরণ

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class FindingContours {
    public static void main(String args[]) throws Exception {
        // OpenCV কোর লাইব্রেরি লোড করা
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        
        String file = "D:\\Images\\shapes.jpg";
        Mat src = Imgcodecs.imread(file);
        
        // সোর্স ইমেজকে বাইনারি-তে কনভার্ট
        Mat gray = new Mat(src.rows(), src.cols(), src.type());
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
        Mat binary = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
        Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY_INV);
        
        // কন্টুর খুঁজা
        List contours = new ArrayList<>();
        Mat hierarchey = new Mat();
        Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE,
                Imgproc.CHAIN_APPROX_SIMPLE);
        
        Iterator it = contours.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        
        /* 
        Mat draw = Mat.zeros(binary.size(), CvType.CV_8UC3);
        for (int i = 0; i < contours.size(); i++) {
            System.out.println(contours);
            Scalar color = new Scalar(0, 0, 255);
            // কন্টুর আঁকা
            Imgproc.drawContours(draw, contours, i, color, 2, Imgproc.LINE_8, hierarchey, 2, new Point()) ;
        }
        HighGui.imshow("Contours operation", draw);
        HighGui.waitKey();
        */
    }
}

আউটপুট

Mat [ 29*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829510, dataAddr=0x19826dc0 ]
Mat [ 58*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829580, dataAddr=0x19826f00 ]
Mat [ 35*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828be0, dataAddr=0x19827100 ]
Mat [ 117*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829190, dataAddr=0x19827280 ]
Mat [ 1*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198292e0, dataAddr=0xba8280 ]
Mat [ 78*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829350, dataAddr=0x19827680 ]
Mat [ 63*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x198289b0, dataAddr=0x19827940 ]
Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828e80, dataAddr=0x19827b80 ]
Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829430, dataAddr=0xb84580 ]
Mat [ 4*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19829120, dataAddr=0xb84440 ]
Mat [ 136*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828ef0, dataAddr=0x19827f80 ]
Mat [ 120*1*CV_32SC2, isCont=true, isSubmat=false, nativeObj=0x19828b00, dataAddr=0x19828440 ]
  1. জাভা ওপেনসিভি লাইব্রেরি ব্যবহার করে রঙিন চিত্রকে সেপিয়া (Sepia) চিত্রে রূপান্তর

  2. জাভা ওপেনসিভি লাইব্রেরি ব্যবহার করে 네가েটিভ চিত্রকে পজিটিভ চিত্রে রূপান্তর

  3. জাভা ওপেনসিভি লাইব্রেরি ব্যবহার করে রঙিন চিত্রকে গ্রেস্কেলে রূপান্তর

  4. জাভা ওপেনসিভি লাইব্রেরি ব্যবহার করে চিত্র লিখা/সংরক্ষণ