先挂上我写的代码:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <highgui.h> #include <cv.h> #include <opencv2/legacy/legacy.hpp> using namespace std; using namespace cv; void f(IplImage *src, IplImage *dst) { CvMemStorage *storage = cvCreateMemStorage(0); CvSeq *comp = NULL; cvPyrSegmentation(src, dst, storage, &comp, 4, 200, 50); int n_comp = comp->total; for (int i = 0; i < n_comp; i++) { CvConnectedComp *cc = (CvConnectedComp *)cvGetSeqElem(comp, i); } cvReleaseMemStorage(&storage); } int main(int argc, char *argv[]) { cvNamedWindow("ch5_1"); IplImage *src = cvLoadImage("F:/BaiduNetdiskDownload/dog1.bmp"); if (!src) { printf("Couldn't seem to Open the image "); return -1; } IplImage *dst = cvCreateImage( cvSize(src->width, src->height), src->depth, src->nChannels ); //printf("%d ",src->nChannels);//查看当前图像的通道数 f(src, dst); //show the image in the named window cvShowImage("ch5_1", dst); while (1) { if (cvWaitKey(10) == 27)break; } cvDestroyWindow("ch5_1"); cvReleaseImage(&src); cvReleaseImage(&dst); return 0; }
问题1:cvPyrSegmentation()函数没找到?
cvPyrSegmentation()这个函数是包含在opencv2/legacy/legacy.hpp文件中,所以需要引入头文件
问题2:程序运行到cvPyrSegmentation()时,程序dang掉了?(这个问题纠结了好一会,愣是没找到原因,最好还是在learning OpenCV书上找到了解决之道)
书上是这样写的:
关于src和dst,需要特别注意一点:由于图像金字塔各层的长和宽都必须是整数,
所以必须要求起始图像的长和宽都能够被2整除,并且能够被2整除的次数不少以金字塔总层数。
例如,对于4层金字塔的高度或宽度为80(2 * 2* 2 * 5)是满足要求的,而为90时(2 * 3* 3 * 5)就是不符合要求的。
所以我将原图设置为了400 * 400 的图像,证实其的正确性。
下面是出图的结果:(由于对图像进行了不正当的操作,原图稍微有点模糊,但不影响最终的效果)