参照stackoverflow
-
将 IplImage 结构换成 Mat结构,重新改写任务1的程序。
早期的OpenCV中,使用IplImage和CvMat数据结构来表示图像。IplImage和CvMat都是C语言的结构。使用这两个结构的问题是内存需要手动管理,开发者必须清楚的知道何时需要申请内存,何时需要释放内存。这个开发者带来了一定的负担,开发者应该将更多精力用于算法设计,因此在新版本的OpenCV中引入了Mat类。 新加入的Mat类能够自动管理内存。使用Mat类,你不再需要花费大量精力在内存管理上。而且你的代码会变得很简洁,代码行数会变少。但C++接口唯一的不足是当前一些嵌入式开发系统可能只支持C语言,如果你的开发平台支持C++,完全没有必要再用IplImage和CvMat。在新版本的OpenCV中,开发者依然可以使用IplImage和CvMat,但是一些新增加的函数只提供了Mat接口。本书中的例程也都将采用新的Mat类,不再介绍IplImage和CvMat。
void MatDoThis(Mat mat) { CvPoint center; double scale = -3; if (mat.empty()) { exit(0); } center = cvPoint(mat.cols / 2, mat.rows / 2); for (int i = 0; i < mat.rows; i++) { for (int j = 0; j < mat.cols; j++) { double dx = (double) (j - center.x) / center.x; double dy = (double) (j - center.y) / center.y; double weight = exp((dx * dx + dy * dy) * scale); uchar *ptr_mat = &mat.at<uchar>(cvPoint(j * 3, i)); ptr_mat[0] = static_cast<uchar>(cvRound(ptr_mat[0] * weight)); ptr_mat[1] = static_cast<uchar>(cvRound(ptr_mat[1] * weight)); ptr_mat[2] = static_cast<uchar>(cvRound(ptr_mat[2] * weight)); } } imwrite("taaarannn_magic_Mat.png", mat); namedWindow("taaarannn_magic_Mat", 1); imshow("taaarannn_magic_Mat", mat); waitKey(0); }
-
用Mat改写后,结果与上图相同。
-
-
在Ubuntu系统中下载安装opencv2.x/3.x,编译运行任务1~2的代码。
-
图文形式记录任务1~3的实验步骤。
以上。