Android + OpenCV - Finding extreme points in contours

简介: 原文链接:http://answers.opencv.org/question/134783/android-opencv-finding-extreme-points-in-contours/导    读:本例子使用轮廓分析,寻找到轮廓的极点;使用了STD的SORT特性。

原文链接http://answers.opencv.org/question/134783/android-opencv-finding-extreme-points-in-contours/

导    读本例子使用轮廓分析,寻找到轮廓的极点;使用了STD的SORT特性。
 

提出问题

Good Evening,

I have a trouble with finding extreme points in frames. I am detecting all contours, but I want find there one extreme point, which is lowest from others (southernmost contour). Here is a preview of screen, what I have.

image description

And here is a preview of screen, what I want ! For example, lowest point will bounded by red rectangle.

image description.

And here is my code, what I have now.

   contours = new ArrayList <MatOfPoint >();
   Rect rect;
   Point c1 = new Point(); Point c2 = new Point();

   Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGB2GRAY);
   subtractorMOG2.apply(mGray, mFGMask, 0. 005);

   Imgproc.threshold(mFGMask, mFGMask, 45, 255, Imgproc.THRESH_BINARY);
   Imgproc.erode(mFGMask, mFGMask, new Mat());
   Imgproc.dilate(mFGMask, mFGMask, new Mat());

   Imgproc.findContours(mFGMask, contours, new Mat(), Imgproc.RETR_EXTERNAL , Imgproc.CHAIN_APPROX_NONE);
   Imgproc.drawContours(mRgba, contours, - 1, new Scalar( 255, 255, 0), 3);

        /*for (int idx = 0; idx < contours.size(); idx++) {

            double contourarea = Imgproc.contourArea(contours.get(idx));
            rect = boundingRect(contours.get(idx));

            c1.x = rect.x; c1.y = rect.y;
            c2.x = rect.x + rect.width; c2.y = rect.y + rect.height;
            if (contourarea > 1024 && contourarea < 30000) {
                Imgproc.rectangle(mRgba, c1, c2, new Scalar(255, 0, 0), 3);
            }
        }*/


  return mRgba;

Thanks everybody for help and comments !

 优质解答   
 
bool  SortbyXaxis( const  Point  &  a,  const  Point  & b) 
{
     return a.x  > b.x;
}
bool SortbyYaxis( const Point  & a,  const Point  &b) 
{
     return a.y  > b.y;
}
int main ( int argc,  char  *  const argv[]) 
{
    Mat mSrc,mDst;
    mSrc  = imread( "e:/sandbox/aline.png"0);
     if (mSrc.empty())
    {
        cerr  <<  "No image supplied ..."  << endl;
         return  - 1;
    }
    cvtColor(mSrc,mDst,COLOR_GRAY2BGR);
     /// Create Window
     const  char * source_window  =  "Output Image";
    namedWindow( source_window, WINDOW_AUTOSIZE );
    vector <vector <Point >  > contours;
    vector <Vec4i > hierarchy;
     /// Find contours
    findContours( mSrc.clone(), contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point( 00) );
    vector <Point > ptsContour;
     for( size_t i  =  0; i < contours.size(); i ++ )
    {
        drawContours( mDst, contours, ( int)i, Scalar( 0, 255, 0),  1);
        ptsContour = contours[i];
        sort( ptsContour.begin(), ptsContour.end(), SortbyYaxis );
        sort( ptsContour.begin(), ptsContour.end(), SortbyXaxis );
        circle(mDst, ptsContour[ 0], 3,Scalar( 0, 255, 255), - 1);
    }
    imshow( source_window, mDst );
    waitKey();
     return  0;
}

image description

 

image description

 程序解读本程序的基本思路是很简答的,就是遍历轮廓,找到轮廓中x和y最大的点,这个点就是极值点。但是有两个地方需要注意:
1、是使用了std的sort特性,应该说简化了程序设计;
2、是findcontours的第二个参数,使用的是“只寻找第一层轮廓”。那么对于本例来说,这样做是合理的。
 
 
 

 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
Java 开发工具 Android开发
Android Studio OpenCV 4.5.2环境搭建
Android Studio OpenCV 4.5.2环境搭建
687 0
|
8月前
|
Java 开发工具 Android开发
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
957 0
|
7月前
|
Java API 开发工具
OpenCV On Android开发 - Android Studio上环境配置
OpenCV On Android开发 - Android Studio上环境配置
86 0
|
缓存 Java Android开发
OpenCV学习笔记(七)—— OpenCV for Android实时图像处理
 在上篇中我们已经实现了相机打开和实时图像信息的获取,那么接下来我们可以尝试在获取的图像信息进行一些处理,然后实时显示出来,在这里我们要完成的的几种处理:         灰化、Canny边缘检测、Hist直...
2053 0
|
计算机视觉 UED
Android+OpenCV 摄像头实时识别模板图像并跟踪
Android+OpenCV 摄像头实时识别模板图像并跟踪
661 0
Android+OpenCV 摄像头实时识别模板图像并跟踪
|
算法 Java Unix
OpenCV 在 Android 上的应用
OpenCV 在 Android 上的应用
570 0
|
IDE Java 开发工具
Python、C++、Android OpenCV 开发环境的配置
在 Mac 上折腾了一下 OpenCV 的配置,分别配置了 Python 、C++ 和 Android 上的开发环境,中间还遇到点坑,简要记录一下。
673 0
Python、C++、Android OpenCV 开发环境的配置
|
Java Android开发 计算机视觉
在Android 上运行 openCV ,并做灰度变化的一个例子
在Android 上运行 openCV ,并做灰度变化的一个例子OpenCVImageProcessing 导入Opencv的 androrid SDK灰度算法 OpenCVImageProcessing 导入opencv Jar包,配置OpenCVLibrary340 的 bulid.
828 0
|
算法 Java Android开发
Android 中使用 dlib+opencv 实现动态人脸检测
1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo。
1868 0
|
Java 开发工具 Android开发
Android studio 3.0配置OpenCV初探
前言 之前一直想对OpenCV进行学习和使用,一直没有实践。这次痛下决心,一定要搞定。经过两天的折腾,遇到各种bug终于搞定了,希望能帮助到初学者,如果里面有那些写的不对的地方,还希望各位看官指正。
1169 0