Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using OpenCV Java Bindings to read an image

I'm using the new OpenCV Java bindings to read an image and do some processing on the image. I'm trying to convert C code to Java using the Java bindings but can't seem to find the relevant methods:

C code:

cv::Mat img = cv::imread(argv[1]);
cv::Mat gray;
cv::cvtColor(img, gray, CV_BGR2GRAY);
int erosion_size = 5;
cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS,
                                       cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
                                       cv::Point(erosion_size, erosion_size) );
cv::erode(gray, gray, element);

I can't find:

  • imread
  • cvtcolor
  • getStructuringElement
  • erode

I looked around the api here: http://docs.opencv.org/java/

Unfortunately the sample java code provided doesn't even show how to read an image!

like image 347
birdy Avatar asked Mar 30 '13 15:03

birdy


2 Answers

To read an image with OpenCV for Java:

OpenCV 2.x (JavaDoc)

Mat img = Highgui.imread("path/to/img");

OpenCV 3.x (JavaDoc)

Mat img = Imgcodecs.imread("path/to/img");

In both versions you can pass a second parameter specifying how to load the image:

  • CV_LOAD_IMAGE_ANYDEPTH: returns 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
  • CV_LOAD_IMAGE_COLOR: always convert image to a color one.
  • CV_LOAD_IMAGE_GRAYSCALE: always convert image to a grayscale one.

Example:

// OpenCV 2.x   
Mat img = Highgui.imread("path/to/img", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
// OpenCV 3.x
Mat img = Imgcodecs.imread("path/to/img", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
like image 77
David Miguel Avatar answered Nov 09 '22 16:11

David Miguel


If you have correctly installed Opencv with support for Java desktop and included opencv-2.4.4.jar , your should import:

import org.opencv.imgproc.Imgproc;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;

And your code will look like this:

Mat img = Highgui.imread(argv[1], Highgui.CV_LOAD_IMAGE_GRAYSCALE);
int erosion_size = 5;
Mat element  = Imgproc.getStructuringElement(
    Imgproc.MORPH_CROSS, new Size(2 * erosion_size + 1, 2 * erosion_size + 1), 
    new Point(erosion_size, erosion_size)
);
Imgproc.erode(img, img, element);
like image 28
andriy Avatar answered Nov 09 '22 16:11

andriy