1

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

4

3 回答 3

4

尝试BGR2GRAY而不是RGB2GRAY。我有同样的问题,我通过这个解决了。文档中还有一个关于这个的注释

将图像从一种颜色空间转换为另一种颜色空间。

该函数cvtColor将输入图像从一种颜色空间转换为另一种颜色空间。在从 RGB 颜色空间转换的情况下,通道的顺序应明确指定 ( RGB or BGR)。请注意,OpenCV 中的默认颜色格式通常称为 RGB,但实际上是 BGR(字节反转)。因此,标准(24 位)彩色图像中的第一个字节将是 8 位蓝色分量,第二个字节将是绿色,第三个字节将是红色。然后第四、第五和第六个字节将是第二个像素(蓝色,然后是绿色,然后是红色),依此类推。

于 2012-06-19T09:31:14.630 回答
0

我以前实际上没有使用过opencv,但我认为这不是convertTo您要寻找的答案。

通过查看 opencv 文档,我发现了这一点

cvtColor - 将图像从一种颜色空间转换为另一种颜色空间

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

或者简单地说(该函数cvtColor将在内部创建图像):

Mat color;
Mat gray;
cvtColor(color, gray, CV_BGR2GRAY);
于 2012-06-09T08:55:59.480 回答
0

如果我正确理解您的第一个问题,您有两个选项可以将 RGB 图像转换为灰度图像。

选项 1:按照您的尝试将 3 通道图像转换为 1 通道。

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);

选项2:直接将彩色图像读取为灰度图像。

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

我希望这适合你。

于 2012-06-09T10:47:08.360 回答