1,221
社区成员
发帖
与我相关
我的任务
分享
#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( "6.jpg", 1 );////为什么图片 66 和 6 轮廓数目不一样嫩?,要加绝对值,,见下面
imshow("原图,这是自己改写的",src);
/// 转化成灰度图像并进行平滑
cvtColor( src, src_gray, CV_BGR2GRAY );
blur( src_gray, src_gray, Size(5,5) );
/// 创建窗口
char* source_window = "Contours";//这里的Contours原来都是Source,被我小小改了下
namedWindow( source_window, CV_WINDOW_AUTOSIZE );
imshow( source_window, src );
//***************************************************************************************************
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// 使用Threshold检测边缘
threshold( src_gray, threshold_output, 124, 255, THRESH_BINARY );//CV_THRESH_OTSU
imshow("阈值图",threshold_output);
/// 找到轮廓
findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );//CHAIN_APPROX_NONE全体,CV_CHAIN_APPROX_SIMPLE,,,RETR_TREE
/// 多边形逼近轮廓 + 获取矩形和圆形边界框
vector<vector<Point> > contours_poly( contours.size() );
//vector<Rect> boundRect( contours.size() );
//vector<Point2f>center( contours.size() );
//vector<float>radius( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{
if(i==1)//这里控制只输出第二层轮廓,
{
approxPolyDP( Mat(contours[1]), contours_poly[i], 0, true );//逼近多边形曲线,数字表示多边形的近似程度
}}
for(int i=0;i<10;i++)//输出第二层轮廓的前十个坐标点
{
cout<<contours[1][i]<<endl;
}
cout<<"输出第一个轮廓第5个点的y坐标 "<<contours[1][5].y<<endl;//试试看输出轮廓第一个点的纵坐标 y y y y y y y y y y
//printf("dian%d",contours[1].total);
/// 画多边形轮廓
Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
//cvtColor( drawing, drawing, CV_BGR2GRAY );
int nn=-1;//////////////////// 这个是自己想出来的 计算边界点个数
for( int i = 1;; i++ )
{
nn++;//nn>3 控制不要在刚开始就判定边界结束,而要在nn足够大 ,绕一圈回来后再判断边界结束
if(nn>3&&( abs(contours[1][i].y-contours[1][0].y)<2)&&( abs(contours[1][i].x-contours[1][0].x)<2))break;
//记得这里一定要加绝对值,不然遇到两个峰值一样的图片会出错,如图6,,,还有这里最好写小于2防止出错!!!
}
nn=nn+2;
printf("这个轮廓的边界点数 大概是 %d\n",nn);
//double cvArcLength(contours[1], 1 );//????????????????
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar(0,0,255 );
//if(contours.size()==2)
drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );// 这里的 i 换成 1 就表示不画出最外层矩形轮廓,4表示四连通,8表示八连通,CV_AA表抗锯齿
//rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 ); //显示矩形的外框
//circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
}
//Mat imageROI= drawing(Rect(2,2,drawing.cols-4,drawing.rows-4));
/// 显示在一个窗口
Mat gray;
cvtColor(drawing,gray,COLOR_BGR2GRAY);
//***************************************************************试试前十个坐标到底从哪开始的
for( int i4 = 0; i4< 10; i4++ )//宝宝 试探出图3的 边界点 总共 有677个点(为什么后来又试探出是736??) *********** ******** *************************
{
gray.at<uchar>(contours[1][i4])=33;
}
imshow( "gray", gray );
printf("轮廓数%d\n", contours.size());
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
// Mat imageROI;
// for( int i = 5; i< 2223332; i++ )
//{imageROI= drawing(Rect(1,1,122,122));}
imshow( "Contours", drawing );
//imshow( "imageROI", imageROI );
imwrite("drawing.jpg",drawing);
//imwrite("gray.jpg",gray);
waitKey(0);
return(0);
}