C++ OpenCV-按宽度和高度过滤斑点

C++ OpenCV-按宽度和高度过滤斑点,c++,opencv,C++,Opencv,我有一张经过canny边缘检测器过滤的图像。现在,我想检测斑点,并根据宽度和高度进行过滤。我必须查看哪些函数?在OpenCV 3.0中,您可以使用它返回一个stats数组,其中包括每个连接组件的宽度和高度: statsv- 每个标签(包括背景标签)的统计信息输出,请参见下面的可用统计信息。通过statsv(标签、列)访问统计信息,其中可用列定义如下 CC_STAT_最左侧(x)坐标,该坐标是包容性起点 边界框在水平方向上的位置 CC_STAT_TOP最顶部(y)坐标,它是边界框在垂直方向上的包

我有一张经过canny边缘检测器过滤的图像。现在,我想检测斑点,并根据宽度和高度进行过滤。我必须查看哪些函数?

在OpenCV 3.0中,您可以使用它返回一个
stats
数组,其中包括每个连接组件的宽度和高度:

statsv-

每个标签(包括背景标签)的统计信息输出,请参见下面的可用统计信息。通过statsv(标签、列)访问统计信息,其中可用列定义如下

  • CC_STAT_最左侧(x)坐标,该坐标是包容性起点 边界框在水平方向上的位置
  • CC_STAT_TOP最顶部(y)坐标,它是边界框在垂直方向上的包容性起点
  • CC_STAT_WIDTH边界框的水平大小
  • CC_STAT_HEIGHT边界框的垂直大小
  • CC_STAT_AREA连接组件的总面积(以像素为单位)
在OpenCV 3.0中,您可以使用它返回一个
stats
数组,其中包括每个连接组件的宽度和高度:

statsv-

每个标签(包括背景标签)的统计信息输出,请参见下面的可用统计信息。通过statsv(标签、列)访问统计信息,其中可用列定义如下

  • CC_STAT_最左侧(x)坐标,该坐标是包容性起点 边界框在水平方向上的位置
  • CC_STAT_TOP最顶部(y)坐标,它是边界框在垂直方向上的包容性起点
  • CC_STAT_WIDTH边界框的水平大小
  • CC_STAT_HEIGHT边界框的垂直大小
  • CC_STAT_AREA连接组件的总面积(以像素为单位)

另一种方法是基于等高线和最小反射点之间的距离。通过这种方式,可以根据采样结果图像上的角度对轮廓进行过滤

您可以通过更改以下行来更改宽高比和角度

if(dist0 > dist1 *4) // dist0 and dist1 means width and height you can change as you wish
.
.
if( fabs(angle) > 35 & fabs(angle) < 150 ) // you can change angle criteria
if(dist0>dist1*4)//dist0和dist1表示宽度和高度,您可以随意更改
.
.
如果(fabs(角度)>35&fabs(角度)<150)//可以更改角度标准

#包括“opencv2/imgproc.hpp”
#包括“opencv2/highgui.hpp”
使用名称空间cv;
使用名称空间std;
//! 计算两点之间的距离
/*! 计算两点之间的欧氏距离
*
*@param a点a
*@param b点b
*/
静态双距离BTW点(常数cv::Point2f&a、常数cv::Point2f&b)
{
双xDiff=a.x-b.x;
双yDiff=a.y-b.y;
返回std::sqrt((xDiff*xDiff)+(yDiff*yDiff));
}
int main(int argc,字符**argv)
{
Mat src,灰色;
src=imread(argv[1]);
if(src.empty())
返回-1;
CVT颜色(src、灰色、灰色);
灰色=灰色<200;
矢量等值线;
findContours(gray.clone()、等高线、等高线、等高线外部、等高线链近似简单);
旋转反射镜;
对于(size_t i=0;idist1*4)
角度=atan2(pts[0]。y-pts[1]。y,pts[0]。x-pts[1]。x)*180.0/CV_-PI;
如果(dist1>dist0*4)
角度=atan2(pts[1]。y-pts[2]。y,pts[1]。x-pts[2]。x)*180.0/CV_-PI;
如果(晶圆(角度)>35和晶圆(角度)<150)
对于(int j=0;j<4;j++)
线(src,pts[j],pts[(j+1)%4],标量(0,0,255),1,线_-AA);
}
imshow(“结果”,src);
等待键(0);
返回0;
}

一种基于等高线和minareact点之间距离的替代方法。通过这种方式,可以根据采样结果图像上的角度对轮廓进行过滤

您可以通过更改以下行来更改宽高比和角度

if(dist0 > dist1 *4) // dist0 and dist1 means width and height you can change as you wish
.
.
if( fabs(angle) > 35 & fabs(angle) < 150 ) // you can change angle criteria
if(dist0>dist1*4)//dist0和dist1表示宽度和高度,您可以随意更改
.
.
如果(fabs(角度)>35&fabs(角度)<150)//可以更改角度标准

#包括“opencv2/imgproc.hpp”
#包括“opencv2/highgui.hpp”
使用名称空间cv;
使用名称空间std;
//! 计算两点之间的距离
/*! 计算两点之间的欧氏距离
*
*@param a点a
*@param b点b
*/
静态双距离BTW点(常数cv::Point2f&a、常数cv::Point2f&b)
{
双xDiff=a.x-b.x;
双yDiff=a.y-b.y;
返回std::sqrt((xDiff*xDiff)+(yDiff*yDiff));
}
int main(int argc,字符**argv)
{
Mat src,灰色;
src=imread(argv[1]);
if(src.empty())
返回-1;
CVT颜色(src、灰色、灰色);
灰色=灰色<200;
矢量等值线;
findContours(gray.clone()、等高线、等高线、等高线外部、等高线链近似简单);
旋转反射镜;
对于(size_t i=0;idist1*4)
角度=atan2(pts[0]。y-pts[1]。y,pts[0]。x-pts[1]。x)*180.0/CV_-PI;
如果(dist1>dist0*4)
角度=atan2(pts[1]。y-pts[2]。y,pts[1]。x-pts[2]。x)*180.0/CV_-PI;
如果(晶圆(角度)>35和晶圆(角度)<150)
对于(int j=0;j<4;j++)
线(src,pts[j],pts[(j+1)%4],标量(0,0,255),1,线_-AA);
}
imshow(“结果”,src);
等待键(0);
返回0;
}
包括返回的
stats
数组中每个连接组件的
width
height