当前位置: 首页 > 知识库问答 >
问题:

如何解决OpenCV绘图轮廓误差

司寇阳曦
2023-03-14

基本上,我试图用一种颜色画出第一个轮廓。但此程序崩溃,出现以下错误:

09-11 09:56:38.390:D/DalvikVM(1920):GC_FOR_ALLOC释放170K,10%释放3702K/4100K,暂停4ms,共4ms

09-11 09:56:38.420:E/CV::error()(1920):OpenCV error:cv::mat cv::cvarrtomat(const CvArr*,bool,bool,int)中参数错误(数组类型未知),文件/home/reports/ci/slave_desktop/50-sdk/OpenCV/modules/core/src/matrix.cpp,第698行

09-11 09:56:38.430:A/libc(1920):致命信号11(SIGSEGV)在0x00000000(CODE=1),线程1920(pencvratstudy01)

程序是

@Override
protected void onCreate(Bundle savedInstanceState) {
     
    Log.i(TAG, "called onCreate");
     super.onCreate( savedInstanceState );
     
     if (!OpenCVLoader.initDebug()) {
         // Handle initialization error
     }
     setContentView(R.layout.activity_main);

   
     // load an image from Resource directory
     Mat mMat = new Mat();
     try {
        mMat = Utils.loadResource(this, R.drawable.baby,
                                                 Highgui.CV_LOAD_IMAGE_COLOR);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  
     // Create result object with correct color
     Mat result = new Mat(); 
     Imgproc.cvtColor(mMat, result, Imgproc.COLOR_RGB2BGRA);
     
     
     // create tmpMat object for gray image and blur it
     Mat tmpMat = new Mat();
     Imgproc.cvtColor(result,tmpMat , Imgproc.COLOR_BGR2GRAY);
     Imgproc.blur(tmpMat, tmpMat, new Size(3,3));
     
     
     /* find cany of tmpMat */
     Mat canny = new Mat();
     Imgproc.Canny( tmpMat, canny , 2 , 4);
     
     // find contours
     Mat hierarchy = new Mat();
     List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
     Imgproc.findContours(canny, contours, hierarchy, Imgproc.RETR_EXTERNAL, 
                                                    Imgproc.CHAIN_APPROX_SIMPLE);

     // draw contour on mask object   
     Mat mask = new Mat();
     Imgproc.drawContours(mask, contours, 0 , new Scalar(255));
    
     
     // create bitmap and draw on imageView
     Bitmap bmp;
     bmp = Bitmap.createBitmap(mask.cols(), mask.rows(), Bitmap.Config.ARGB_8888);
     Utils.matToBitmap(mask, bmp);
     
     ImageView imgView = (ImageView) findViewById(R.id.sampleImageView);
     imgView.setImageBitmap(bmp);
   
     
}

这里有什么问题?

共有1个答案

徐佐
2023-03-14

问题是您给DrawControlours方法提供了错误的mat类型,您可以使用

Mat mask = Mat.zeros(result.rows(),result.cols(),result.type());

另一个建议是使用静态块在onCreate之前加载opencv:

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}
 类似资料:
  • 本文向大家介绍如何使用Java OpenCV库查找图像轮廓?,包括了如何使用Java OpenCV库查找图像轮廓?的使用技巧和注意事项,需要的朋友参考一下 轮廓线不过是连接沿着特定形状的边界的所有点的线。使用这个你可以- 查找对象的形状。 计算对象的面积。 检测物体。 识别对象。 您可以使用findContours()方法找到图像中各种形状的轮廓,对象。此方法接受以下参数- 二进制图像。 类型为M

  • 目标 了解轮廓是什么。 学习查找轮廓,绘制轮廓等。 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。 为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。 从OpenCV 3.2开始

  • 我已经找到了轮廓,但问题是 findcontours() 以随机顺序返回轮廓,就像在 contour(0) 处,它从页面中间显示一些 sontour。如何对它们进行垂直排序?从上到下,然后从左到右?鉴于下图,我水平连接组件并将每个MCQ与其选择连接起来,然后应用findcontours(),现在我想按顺序对它们进行排序,以便按顺序检索它们

  • 问题内容: 有没有一种简单的方法来获取绘制如下轮廓线的(x,y)值: 问题答案: 查看返回的ContourSet的collections属性。特别是第一个集合的get_paths()方法返回组成每个线段的成对点。 要获取坐标的NumPy数组,请使用属性。

  • 我正在开发一个程序,提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于要删除任何非“方形”轮廓的位置。我想知道我怎么能做到这一点。 我所做的就是加载图像,使其变灰,模糊,精明的边缘检测,放大它,找到轮廓并绘制它们。 有没有一种方法可以让我在轮廓周围画出而不是填充它们?并删除周围大小不大致相同或几乎有90度角的轮廓? 这是初始图像: 以下是绘制轮廓的图像:

  • 我有一个边缘被坎尼探测到。我想提取边缘的轮廓。 我已经检查了下面的帖子。OpenCV转换Canny边缘到轮廓。 但是它没有处理复杂的形状。例如,带矩形的圆或带线的圆。 cv::findContours()函数有两个问题。1.返回非闭合边的闭合轮廓,但我需要非闭合轮廓2。为闭合边返回2个闭合轮廓(可能其中一个轮廓用于边,另一个用于边的内侧,但我想要两个轮廓中的一个。 有没有办法解决这个问题?谢谢。