Hend Mohamad
Hend Mohamad

Reputation: 51

opencv problems on Android

Please we need help urgently, we are using openCv in Android (Java). We are facing a lot of problems:

convertTo() doesn't work so we can't convert 3 channel image to 1 channel without passing it on cvtColor().

grayImg.convertTo(grayImg, CvType.CV_8UC1);

cvtColor() gives a weird output:

Imgproc.cvtColor(src, grayImg, Imgproc.COLOR_RGB2GRAY);

Output of this line is the image repeated 4 times! The only way to get rid of this repetition is to add this line and the output is a white and black image but 3 channel so it crashes any coming function because it needs 1 channel image.

Imgproc.cvtColor(grayImg, grayImg, Imgproc.COLOR_GRAY2RGB,3);

canny() for edge detection:

Imgproc.Canny(grayImg, grayImg, 10, 100,3,true);

findContours() counts a horrible number of contours while number of objects in the image is only 2 input image is 3 channel bmp image and we convert it to Mat.

output image:

https://dl.dropbox.com/u/36214963/canny.jpg

Thanks for your concern

Upvotes: 1

Views: 2713

Answers (3)

Francis Roshan
Francis Roshan

Reputation: 41

Try BGR2GRAY rather than RGB2GRAY.I had the same problem and I solved it through this.There is also a note in the documentation about this

Converts an image from one color space to another.

The function cvtColor converts an input image from one color space to another. In case of a transformation to-from RGB color space, the order of the channels should be specified explicitly (RGB or BGR). Note that the default color format in OpenCV is often referred to as RGB but it is actually BGR (the bytes are reversed). So the first byte in a standard (24-bit) color image will be an 8-bit Blue component, the second byte will be Green, and the third byte will be Red. The fourth, fifth, and sixth bytes would then be the second pixel (Blue, then Green, then Red), and so on.

Upvotes: 4

Yosef Ibrahim
Yosef Ibrahim

Reputation: 1

I haven't actually used opencv before, but I don't think convertTo is the answer your looking for.

By looking at the opencv documentation I found this:

cvtColor - Converts an image from one color space to another

Mat color; // the input image
Mat gray(color.rows, color.cols, color.depth()); 
cvtColor(color, gray, CV_BGR2GRAY);

Or simply (and the function cvtColor will create the image internally):

Mat color;
Mat gray;
cvtColor(color, gray, CV_BGR2GRAY);

Upvotes: 0

Ismail
Ismail

Reputation: 1

If I understand your first question correctly, you have two options to convert RGB images to grayscale ones.

Option 1: Convert the 3 channel image to 1 channel as you are trying to do.

IplImage *RGB_image = cvLoadImage("my_colored_image.jpg");
IplImage *GRAY_IMAGE = cvCreateImage(cvGetSize(RGB_image), IPL_DEPTH_8U, 1);
cvCvtColor(RGB_image, GRAY_IMAGE, CV_RGB2GRAY);

Option 2: Read the colored image as a grayscale image directly.

IplImage* GRAY_IMAGE = cvLoadImage("my_colored_image.jpg", CV_LOAD_IMAGE_GRAYSCALE);

I hope this suits you.

Upvotes: 0

Related Questions