大家好,又见面了,我是你们的朋友全栈君。
1、arcLength函数
函数的作用
主要是计算图像轮廓的周长、
2、函数调用形式
C++: double arcLength(InputArray curve, bool closed)
参数详解:
InputArray curve:表示图像的轮廓
bool closed:表示轮廓是否封闭的
3、一般图像轮廓矩也可以算出图像的周长和面积
opencv代码:
-
#include “opencv2/highgui/highgui.hpp”
-
#include “opencv2/imgproc/imgproc.hpp”
-
#include <iostream>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
using
namespace cv;
-
using
namespace
std;
-
-
Mat src; Mat src_gray;
-
int thresh =
100;
-
int max_thresh =
255;
-
RNG rng(12345);
-
-
/// 函数声明
-
void thresh_callback(int, void* );
-
-
/** @主函数 */
-
int main( int argc, char** argv )
-
{
-
/// 读入原图像, 返回3通道图像数据
-
src = imread( argv[
1],
1 );
-
-
/// 把原图像转化成灰度图像并进行平滑
-
cvtColor( src, src_gray, CV_BGR2GRAY );
-
blur( src_gray, src_gray, Size(
3,
3) );
-
-
/// 创建新窗口
-
char* source_window =
“Source”;
-
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
-
imshow( source_window, src );
-
-
createTrackbar(
” Canny thresh:”,
“Source”, &thresh, max_thresh, thresh_callback );
-
thresh_callback(
0,
0 );
-
-
waitKey(
0);
-
return(
0);
-
}
-
-
/** @thresh_callback 函数 */
-
void thresh_callback(int, void* )
-
{
-
Mat canny_output;
-
vector<
vector<Point> > contours;
-
vector<Vec4i> hierarchy;
-
-
/// 使用Canndy检测边缘
-
Canny( src_gray, canny_output, thresh, thresh*
2,
3 );
-
/// 找到轮廓
-
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(
0,
0) );
-
-
/// 计算矩
-
vector<Moments> mu(contours.size() );
-
for(
int i =
0; i < contours.size(); i++ )
-
{ mu[i] = moments( contours[i],
false ); }
-
-
/// 计算中心矩:
-
vector<Point2f> mc( contours.size() );
-
for(
int i =
0; i < contours.size(); i++ )
-
{ mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }
-
-
/// 绘制轮廓
-
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
-
for(
int i =
0; i< contours.size(); i++ )
-
{
-
Scalar color = Scalar( rng.uniform(
0,
255), rng.uniform(
0,
255), rng.uniform(
0,
255) );
-
drawContours( drawing, contours, i, color,
2,
8, hierarchy,
0, Point() );
-
circle( drawing, mc[i],
4, color,
-1,
8,
0 );
-
}
-
-
/// 显示到窗口中
-
namedWindow(
“Contours”, CV_WINDOW_AUTOSIZE );
-
imshow(
“Contours”, drawing );
-
-
/// 通过m00计算轮廓面积并且和OpenCV函数比较
-
printf(
“\t Info: Area and Contour Length \n”);
-
for(
int i =
0; i< contours.size(); i++ )
-
{
-
printf(
” * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n”, i, mu[i].m00, contourArea(contours[i]), arcLength( contours[i],
true ) );
-
Scalar color = Scalar( rng.uniform(
0,
255), rng.uniform(
0,
255), rng.uniform(
0,
255) );
-
drawContours( drawing, contours, i, color,
2,
8, hierarchy,
0, Point() );
-
circle( drawing, mc[i],
4, color,
-1,
8,
0 );
-
}
-
}
</div>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132125.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...