什么是轮廓:一个轮廓是由图像中的一系列点组成的,也就是图像中的一条曲线。在OpenCV中一般用序列来存储轮廓信息。序列中的每个元素是曲线中每个点的位置。
关于序列:序列是内存存储器中可以存储的一种对象,序列是某种结构的链表。
下面是序列结构体:
typedef sturct CvSeq{
int flags;
int header_size;
CvSeq * h_prev;
CvSeq * h_next;
CvSeq * v_prev;
CvSeq * v_next;
int total;
int elem_size;
char *bolck_max;
char * ptr;
int delta_elems;
CvMemStorage * storage;
CvSeqBlock * free_blocks;
CvSeqBlock * first;
}
Freeman编码
在Freeman链码中,多边形被表示成一系列的位移,每一个位移都有8个方向,这8个方向从0到7表示。
findContours()函数来寻找图像中物体的轮廓,并结合drawContours()函数将找到的轮廓绘制出。
void cv::findContours ( InputOutputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point()
)
参数解释:
void cv::drawContours ( InputOutputArray image,
InputArrayOfArrays contours,
int contourIdx,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
InputArray hierarchy = noArray(),
int maxLevel = INT_MAX,
Point offset = Point()
)
参数解释:
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src,dst,gray_img;
src = imread("1.jpg");
if(src.empty())
{
cout<<"图像加载失败";
waitKey(0);
return -1;
}
else
cout<<"图像加载成功";
namedWindow("1",WINDOW_AUTOSIZE);
imshow("1",src);
cvtColor(src,gray_img,CV_BGR2GRAY);
vector>contours;
vectorhierarchy;
gray_img = gray_img > 100;
findContours(gray_img,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);
//绘制轮廓图
dst = Mat::zeros(src.size(), CV_8UC3);
for (int i = 0; i < hierarchy.size(); i++)
{
Scalar color = Scalar(rand() % 255, rand() % 255, rand() % 255);
drawContours(dst, contours, i, color, CV_FILLED, 8, hierarchy);
}
imshow("轮廓图", dst);
waitKey(0);
waitKey(0);
return 0;
}