【问题标题】:opencv problems on AndroidAndroid上的opencv问题
【发布时间】:2012-06-08 18:54:53
【问题描述】:

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

convertTo() 不起作用,因此我们无法将 3 通道图像转换为 1 通道而不将其传递给 cvtColor()。

grayImg.convertTo(grayImg, CvType.CV_8UC1);

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。

输出图像:

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

感谢您的关心

【问题讨论】:

    标签: android eclipse opencv edge-detection javacv


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      我希望这适合你。

      【讨论】:

      • 我们也尝试过这样做,我们将输入图像设为灰度图像(从 matlab 获取),并且不断出现相同的结果!
      • 能否附上输入图像和给出这些奇怪结果的代码部分,我将等待链接。
      • 图片:dl.dropbox.com/u/36214963/canny.jpgsrc=Utils.bitmapToMat(bmp); grayImg=new Mat(src.rows(), src.cols(), CvType.CV_8UC1); Imgproc.cvtColor(src, grayImg, Imgproc.COLOR_RGB2GRAY,1);
      • 实际上我现在无法提供帮助,但我会继续搜索,(我认为这些主题与您的问题有关,它们可能还包含有用的信息,尤其是最后的 cmets“ARGB_8888 东西”)@987654322 @groups.google.com/forum/?fromgroups#!topic/android-opencv/…h groups.google.com/forum/#!msg/android-opencv/_FMvZxP43ws/…
      • 非常感谢您的关心,他们发布了一个新版本,它似乎旧版本有错误,所以不用麻烦自己非常感谢
      【解决方案3】:

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

      通过查看我找到的 opencv 文档this

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

      【讨论】:

      • 是的,我们已经这样做了,但输出如图所示,太奇怪了。谢谢您的关注,如果您知道解决方案,请帮助我们
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2022-10-12
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多