您的位置:首页 > 运维架构

OpenCV学习之形态学操作

2017-08-03 20:05 399 查看
//形态学操作
#include "cv.h"
#include "highgui.h"
IplImage* src = 0;
IplImage* dst = 0;
IplConvKernel* element = 0;
int element_shape = CV_SHAPE_RECT;
int max_iters = 10;
int open_close_pos = 0;
int erode_dilate_pos = 0;
void OpenClose(int pos) {
int n = open_close_pos - max_iters;
int an = n > 0 ? n : -n;
element = cvCreateStructuringElementEx(an * 2 + 1, an * 2 + 1, an, an, element_shape, 0);
if (n < 0) {
cvErode(src, dst, element, 1);
cvDilate(dst, dst, element, 1);
}
else {
cvDilate(src, dst, element, 1);
cvErode(dst, dst, element, 1);
}
cvReleaseStructuringElement(&element);
cvShowImage("Open/Close", dst);
}
void ErodeDilate(int pos) {
int n = erode_dilate_pos - max_iters;
int an = n > 0 ? n : -n;
element = cvCreateStructuringElementEx(an * 2 + 1, an * 2 + 1, an, an, element_shape, 0);
if (n > 0) {
cvErode(src, dst, element, 1);
}
else {
cvDilate(src, dst, element, 1);
}
cvReleaseStructuringElement(&element);
cvShowImage("Erode/Dilate", dst);
}
int main(int argc, char** argv) {
src = cvLoadImage("Lena.tif", 1);
printf("Hot Key:\n"
"\tEsc - quit\n"
"\tr - use rectangle structuring element\n"
"\te - use elloptic structuring element\n"
"\tc - use cross - shaped structuring element\n"
"\tENTER - loop through all the options\n");
dst = cvCloneImage(src);
cvNamedWindow("Open/Close", 1);
cvNamedWindow("Erode/Dilate");
open_close_pos = erode_dilate_pos = max_iters;
cvCreateTrackbar("iterations", "Open/Close", &open_close_pos, max_iters * 2 + 1, OpenClose);
cvCreateTrackbar("iterations", "Erode/Dilate", &erode_dilate_pos, max_iters * 2 + 1, ErodeDilate);
while (1) {
int c;
OpenClose(open_close_pos);
ErodeDilate(erode_dilate_pos);
c = cvWaitKey(0);
if (c == 27)
break;
else if (c == 'r')
element_shape = CV_SHAPE_RECT;
else if (c == 'e')
element_shape = CV_SHAPE_ELLIPSE;
else if (c == 'c')
element_shape = CV_SHAPE_CROSS;
else if (c == '\r')
element_shape = (element_shape + 1) % 3;
}
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvDestroyWindow("Open/Close");
cvDestroyWindow("Erode/Dilate");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息