1、无法解决的问题
The problem is that. I just want to take the external contours of the main leaf in the image. Or If it is possible, The image can be cleaned. The second important point is that the process should be standard for all images.

2、如何从图像中获得完整轮廓

# How to find dimensions of an object in the image

I want to find the length of an object in the image (image length not the real physical length). My first idea is was to use boundingRect to find the dimensions, but some of the masks I have split in between them so the boundingRect method fails. Can someone suggest me a robust method to find the length of the object in the given mask

1、形态学变化
dilate(bw,bw,Mat(11,11,CV_8UC1));
erode(bw,bw,Mat(11,11,CV_8UC1));
2、实在距离太远，靠不上了，直接把中线连起来吧

//程序主要部分
int mainint argcchar** argv )
{
//读入图像，转换为灰度
Mat bw;
bool dRet;
cvtColor(imgbwCOLOR_BGR2GRAY);
//阈值处理
threshold(bwbw, 150, 255, CV_THRESH_BINARY);
bitwise_not(bw,bw);
//形态学变化
dilate(bw,bw,Mat(11,11,CV_8UC1));
erode(bw,bw,Mat(11,11,CV_8UC1));
//寻找轮廓
vector<vector<Point> > contours;
vector<Vec4ihierarchy;
findContours(bwcontourshierarchyCV_RETR_LISTCV_CHAIN_APPROX_NONE);
/// 计算矩
vector<Momentsmu(contours.size() );
forint i = 0; i < contours.size(); i++ )
mu[i] = momentscontours[i], false );
///  计算中心矩:
vector<Point2fmccontours.size() );
forint i = 0; i < contours.size(); i++ )
mc[i] = Point2fmu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 );
//connect all contours into ONE
for (int i = 0; i < contours.size(); ++i)
{
Scalar color = Scalarrng12345.uniform(0, 255), rng12345.uniform(0,255), rng12345.uniform(0,255) );
drawContoursimgcontoursicolor, 2, 8, hierarchy, 0, Point() );
circleimgmc[i], 4, color, -1, 8, 0 );
//connect
if (i+1 <contours.size())
line(bw,mc[i],mc[i+1],Scalar(255,255,255));
}
contours.clear();
hierarchy.clear();
//寻找结果
findContours(bwcontourshierarchyCV_RETR_LISTCV_CHAIN_APPROX_NONE);
for (int i = 0;i<contours.size();i++)
{
RotatedRect minRect = minAreaRectMat(contours[i]) );
Point2f rect_points[4];
minRect.pointsrect_points );
forint j = 0; j < 4; j++ )
lineimgrect_points[j], rect_points[(j+1)%4],Scalar(255,255,0),2);
float fshort = std::min(minRect.size.width,minRect.size.height); //short
float flong = std::max(minRect.size.width,minRect.size.height);  //long
}
imshow("img",img);
waitKey();
return 0;
}

3、新函数

# Orientation of two contours

I try to calculate the orientation of 2 contours. At the end i want to rotate one contour, so it is in cover with the other one. With my code I get a result, but it isn't that accurate. Also I get the same orientations although the contours is rotated around 90 degrees.

## Shape Distance and Common Interfaces

https://docs.opencv.org/3.0-beta/modules/shape/doc/shape_distances.html#shapecontextdistanceextractor

Shape Distance algorithms in OpenCV are derivated from a common interface that allows you toswitch between them in a practical way for solving the same problem with different methods.Thus, all objects that implement shape distance measures inherit theShapeDistanceExtractor interface.

4、发现opencv的不足

# I need a maxEnclosingCircle function

opencv目前是没有最大内接圆函数的（当然它还没有很多函数），但是这个只有研究要一定程度的人才会发现。这里他提问了，我帮助解决下：

#include "stdafx.h"
#include <iostream>

using namespace std;
using namespace cv;

VP FindBigestContour(Mat src){
int imax = 0//代表最大轮廓的序号
int imaxcontour = -1//代表最大轮廓的大小
std::vector<std::vector<cv::Point>>contours;
findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for (int i=0;i<contours.size();i++){
int itmp =  contourArea(contours[i]);//这里采用的是轮廓大小
if (imaxcontour < itmp ){
imax = i;
imaxcontour = itmp;
}
}
return contours[imax];
}
int main(int argc, char* argv[])
{
Mat temp;
cvtColor(src,temp,COLOR_BGR2GRAY);
threshold(temp,temp,100,255,THRESH_OTSU);
imshow("src",temp);
//寻找最大轮廓
VP VPResult = FindBigestContour(temp);
//寻找最大内切圆
int dist = 0;
int maxdist = 0;
Point center;
for(int i=0;i<src.cols;i++)
{
for(int j=0;j<src.rows;j++)
{
dist = pointPolygonTest(VPResult,cv::Point(i,j),true);
if(dist>maxdist)
{
maxdist=dist;
center=cv::Point(i,j);
}
}
}
//绘制结果
circle(src,center,maxdist,Scalar(0,0,255));
imshow("dst",src);
waitKey();
}

1、Removing contours from an image using Python and OpenCV

3、Finding extreme points in contours with OpenCV
https://www.pyimagesearch.com/2016/04/11/finding-extreme-points-in-contours-with-opencv/

int mainint argcchar** argv )
{
Mat bw;
bool dRet;
//resize
pyrDown(img,img);
pyrDown(img,img);
cvtColor(imgbwCOLOR_BGR2GRAY);
//morphology operation
threshold(bwbw, 150, 255, CV_THRESH_BINARY);
//bitwise_not(bw,bw);
//find and draw contours
vector<vector<Point> > contours;
vector<Vec4ihierarchy;
findContours(bwcontourshierarchyCV_RETR_LISTCV_CHAIN_APPROX_NONE);
for (int i = 0;i<contours.size();i++)
{
RotatedRect minRect = minAreaRectMat(contours[i]) );
Point2f rect_points[4];
minRect.pointsrect_points );
forint j = 0; j < 4; j++ )
lineimgrect_points[j], rect_points[(j+1)%4],Scalar(255,255,0),2);
}
imshow("img",img);
waitKey();
return 0;
}