Android上的opencv问题

Android上的opencv问题,android,eclipse,opencv,edge-detection,javacv,Android,Eclipse,Opencv,Edge Detection,Javacv,我们急需帮助,我们正在使用Android(Java)中的openCv。 我们面临着很多问题: convertTo()无法工作,因此如果不将其传递给cvtColor(),则无法将3通道图像转换为1通道 cvtColor()提供了一个奇怪的输出: Imgproc.cvtColor(src, grayImg, Imgproc.COLOR_RGB2GRAY); 该行的输出是重复4次的图像! 消除这种重复的唯一方法是添加这一行,输出是一个黑白图像,但有3个通道,因此它会崩溃任何函数,因为它需要1个通道图

我们急需帮助,我们正在使用Android(Java)中的openCv。 我们面临着很多问题:

convertTo()无法工作,因此如果不将其传递给cvtColor(),则无法将3通道图像转换为1通道

cvtColor()提供了一个奇怪的输出:

Imgproc.cvtColor(src, grayImg, Imgproc.COLOR_RGB2GRAY);
该行的输出是重复4次的图像! 消除这种重复的唯一方法是添加这一行,输出是一个黑白图像,但有3个通道,因此它会崩溃任何函数,因为它需要1个通道图像

Imgproc.cvtColor(grayImg, grayImg, Imgproc.COLOR_GRAY2RGB,3);
canny()用于边缘检测:

Imgproc.Canny(grayImg, grayImg, 10, 100,3,true);
findContours()计算了大量的轮廓,而图像中的对象数量仅为2。输入图像为3通道bmp图像,我们将其转换为Mat

输出图像:


感谢您的关注

我以前没有实际使用过opencv,但我认为
convertTo
不是您想要的答案

通过查看opencv文档,我发现:

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

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


我以前没有实际使用过opencv,但我不认为
convertTo
是您想要的答案

通过查看opencv文档,我发现:

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

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


如果我正确理解了第一个问题,您有两个选项可以将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);

我希望这适合您。

如果我正确理解您的第一个问题,您有两个选项可以将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);

我希望这适合您。

尝试
BGR2GRAY
而不是
RGB2GRAY
。我也遇到了同样的问题,我通过这个解决了它。文档中也有关于这个问题的说明

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


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

尝试
BGR2GRAY
而不是
RGB2GRAY
。我遇到了同样的问题,并通过此解决了它。文档中也有关于此问题的说明

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


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

是的,我们已经这样做了,但是输出如图所示,这太奇怪了。感谢您的关注,如果您知道解决方案,请帮助我们。是的,我们已经这样做了,但是输出如图所示,这太奇怪了。感谢您的关注,如果您知道解决方案,请帮助我们,我们也尝试过这样做,我们把输入的图像变成了灰度图像(从matlab获得),同样的结果不断出现!请附上输入图像和给出这些奇怪结果的代码部分,我将等待链接;grayImg=newmat(src.rows(),src.cols(),CvType.CV_8UC1);Imgproc.cvt颜色(src,grayimgimg,Imgproc.COLOR_RGB2GRAY,1);事实上,我现在无法提供帮助,但我会继续搜索,(我认为这些主题与您的问题有关,它们可能也包含有用的信息,特别是最后的评论“ARGB_8888 stuff”),h非常感谢您的关注,他们发布了一个新版本,它工作了。看起来旧版本有错误,所以不需要麻烦你自己。多亏了我们也尝试了这么做,我们把输入图像变成了灰度图像(来自matlab),同样的结果不断出现!请附上输入图像和给出这些奇怪结果的代码部分,我将等待链接;grayImg=newmat(src.rows(),src.cols(),CvType.CV_8UC1);Imgproc.cvt颜色(src,grayimgimg,Imgproc.COLOR_RGB2GRAY,1);事实上,我现在无法提供帮助,但我会继续搜索,(我认为这些主题与您的问题有关,它们可能也包含有用的信息,特别是最后的评论“ARGB_8888 stuff”),h非常感谢您的关注,他们发布了一个新的版本,它的工作,似乎旧版本有错误,所以没有必要打扰你自己,谢谢
IplImage* GRAY_IMAGE = cvLoadImage("my_colored_image.jpg", CV_LOAD_IMAGE_GRAYSCALE);