【OpenCV】轮廓处理
来源:互联网 发布:在线文字识别软件 编辑:程序博客网 时间:2024/05/19 14:51
在Qt中使用OpenCV库,下面是轮廓处理的程序
void SecondWindow::on_pushButton_4_clicked(){ Mat showMat(frame); //frame是视频取到一帧的图像 Mat imgHSV; IplImage *gray; //申请IplImage类型指针 gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 1); cvtColor(showMat, imgHSV, COLOR_BGR2HSV); //BGR->HSV GaussianBlur( imgHSV, imgHSV, Size( 5, 5 ), 0, 0 ); //图像进行高斯滤波 for(int i=0;i<imgHSV.rows;i++) //提取需要的颜色 { for(int j=0;j<imgHSV.cols;j++) { int H = imgHSV.at<Vec3b>(i,j)[0] ; int S = imgHSV.at<Vec3b>(i,j)[1]; int V = imgHSV.at<Vec3b>(i,j)[2]; if((H>15&&H<40)&&S>50&&V>50) //黄色范围 { imgHSV.at<Vec3b>(i,j)[0] =0; imgHSV.at<Vec3b>(i,j)[1] =0; imgHSV.at<Vec3b>(i,j)[2] =0; ((uchar *)(gray->imageData + i*gray->widthStep))[j]=255; //单通道字节型图像赋值 } else { ((uchar *)(gray->imageData + i*gray->widthStep))[j]=0; imgHSV.at<Vec3b>(i,j)[0] =180; imgHSV.at<Vec3b>(i,j)[1] =255; imgHSV.at<Vec3b>(i,j)[2] =255; } } } cvSmooth(gray, gray,CV_GAUSSIAN,3,3,0,0); //cvSmooth函数平滑滤波 CvSeq* contour = 0; //CvSeq类型 存放检测到的图像轮廓边缘所有的像素序列,坐标值特征的结构体以链表形式 CvMemStorage* storage = cvCreateMemStorage(0); //开辟内存空间 cvFindContours( gray, storage, &contour, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);//检测图像轮廓 CvRect rect = cvBoundingRect(contour, 0); //cvBoundingRect 计算得出外接矩形的顶点坐标rect.x, rect.y ,和矩形的高 rect.height,宽rect.width。 ui->label_4->setText(QString::number(rect.y,10)); //打印坐标到QT的label上 ui->label_3->setText(QString::number(rect.x,10)); ui->label_5->setText(QString::number(rect.width,10)); ui->label_6->setText(QString::number(rect.height,10));}说明:
1.cvtColor函数用来转换图像,转换的格式可以是
CV_RGB2GRAY //彩色图像---灰度图像
CV_BGR2HSV,CV_RGB2HSV,CV_HSV2BGR, CV_HSV2RGB //BGR与HSV相互转化
CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR,CV_YCrCb2RGB
2.程序中使用到单通道的图像赋值多通道可以是
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=0; // B
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=0; // G
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=0; // R
3.cvFindContours函数用来提取轮廓
检查的模式可以分为:
CV_RETR_EXTERNAL:只检索最外面的轮廓;
CV_RETR_LIST:检索所有的轮廓,并将其放入list中;
CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。
边缘处理方式可以分为:
边缘处理方式可以分为:
CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。
CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法。使用CV_RETR_LIST检索模式能使用此方法。
0 1
- 【OpenCV】轮廓处理
- opencv 图像轮廓处理
- 【OpenCV 图像轮廓处理函数】
- opencv 轮廓处理与切割
- opencv-OpenCV中的图像处理 [2]-OpenCV中的轮廓
- openCV轮廓
- OPENCV轮廓
- OpenCV 轮廓
- opencv:轮廓
- OpenCV-轮廓
- OpenCV中常用到的轮廓处理函数汇总
- OpenCV中常用到的轮廓处理函数汇总
- opencv 连通域轮廓处理的一点记录
- Python-OpenCV 处理图像:图像中边界和轮廓检测
- opencv图像处理之轮廓外背景颜色改变
- opencv 查找轮廓 绘制轮廓
- OpenCV 轮廓检测
- OpenCV查找轮廓
- 视频文件格式
- Eclipse快捷键
- 'The sandbox is not sync with the Podfile.lock'的问题
- TextInputLayout 中文翻译
- git之:创建与合并分支
- 【OpenCV】轮廓处理
- 欢迎使用CSDN-markdown编辑器
- Android Studio调试
- 项目 笔记
- leetcode_c++:链表:Linked List Cycle(141)
- mysql数据库语句
- 怎样自动调节NiceLabel中文本框大小?
- 无法访问localhost和127.0.0.1的内容
- android.content.res.Resources$NotFoundException: String resource ID #0xffffffff