【练习6.14】积分图像cvIntegral及使用积分图的性质找横向和纵向边,IplImage结构中widthStep细节
题目要求 |
程序代码 |
结果图片 |
要言妙道 |
加载一副灰度图,得到它的积分图。利用积分图的性质找到图像里的横向和纵向边缘。
利用细长的矩形,在适当的位置减去或加上它们。
备注:边缘查找尚未加入代码
1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6 #include <cv.h> 7 #include <highgui.h> 8 #include <iostream> 9 10 #include <opencv2/legacy/legacy.hpp> 11 //#pragma comment(lib, "opencv_legacy2411.lib") 12 13 using namespace cv; 14 using namespace std; 15 16 //函数声明-->--->-->--->-->--->-->--->// 17 18 19 //<--<--<--<--<--<--<--<--<--函数声明// 20 21 int _tmain(int argc, _TCHAR* argv[]) 22 { 23 const char* image_path = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第6章\\纵横线2.jpg"; 24 IplImage * image_resource = cvLoadImage(image_path, CV_LOAD_IMAGE_GRAYSCALE); 25 assert(image_resource); 26 27 cvNamedWindow("原始图像", CV_WINDOW_AUTOSIZE); 28 cvShowImage("原始图像", image_resource); 29 30 CvSize size_image = cvSize(image_resource->width, image_resource->height); 31 32 IplImage * image_sum = cvCreateImage(cvSize(size_image.width+1,size_image.height+1), IPL_DEPTH_32F, image_resource->nChannels); 33 34 cvIntegral(image_resource, image_sum); 35 36 cvSave("image_sum.xml", image_sum); 37 38 //IplImage * image_8U_ToShow = cvCreateImage(size_image, IPL_DEPTH_8U, image_sum->nChannels); 39 40 //cvNamedWindow("积分图像", CV_WINDOW_AUTOSIZE); 41 //cvShowImage("积分图像", image_8U_ToShow); 42 43 cvWaitKey(); 44 45 cvReleaseImage(&image_resource); 46 cvReleaseImage(&image_sum); 47 //cvReleaseImage(&image_8U_ToShow); 48 49 cvDestroyAllWindows(); 50 51 return 0; 52 }
①对于一幅灰度的图像,积分图像中的任意一点(x,y)的值是指从图像的左上角到这个点的所构成的矩形区域内所有的点的灰度值之和
②如果输入图像大小是W×H,则输出图像sum、sqsum、tilted_sum的大小鼻息为(W+1)×(H+1)
③根据输入图像的数据类型,注意将输出图像设置为32位整型或32或64位浮点型或
④参数widthStep与前面讨论过的CvMat中的step参数类似,包括相邻行的同列点之间的字节数。仅凭变量width是不能计算这个值得,因为为了处理过程更高效,每行都会有固定字节数来对其;因此第i行末和第i+1行开始处可能会有些冗余字节。widthstep是行字节数,应该是4的倍数
‖==========钟于原创 乐于分享 宁静致远 毋忆典藏==========‖