创建一个ROI Mat,包含 50 X 50像素,起点(25,25)
Mat roi(image, Rect(25, 25, 50, 50));
在表征Mat的范围的时候,顺序是 row 然后是 col (先高后宽)。若使用此方法获取ROI,那么在ROI上的操作将直接作用到原图像上。创建的ROI并没有做一个深度copy,如果想要一个真正的copy,使用clone函数
Mat imageCopy = image.clone();
如果想要把感兴趣区域高亮一下,用这样的骚操作
Mat roi(image, Rect(500, 138, 65, 65)); roi = Scalar(0);
这样你的roi就成了一块儿黑炭了。
这里给出一个在图像上放置一个黑色十字的例子
#include <QCoreApplication> #include "opencv2/opencv.hpp" using namespace cv; void crossTrape(Mat &rSrcImage); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Mat srcImage = imread("c:/users/administrator/desktop/cat.jpg"); crossTrape(srcImage); imshow("output", srcImage); return a.exec(); } void crossTrape(Mat &rSrcImage) { Mat centralCols = rSrcImage.colRange(rSrcImage.cols / 2 - 10, rSrcImage.cols / 2 + 10); Mat centralRows = rSrcImage.rowRange(rSrcImage.rows / 2 - 10, rSrcImage.rows / 2 + 10); centralCols = Scalar(0); centralRows = Scalar(0); }
效果图
遍历所有像素,整体增亮函数:
void darker(Mat &rSrcImage) { for(int i = 0; i < rSrcImage.rows; i++) { for(int j = 0; j < rSrcImage.cols; j++) { rSrcImage.at<Vec3b>(i, j) = rSrcImage.at<Vec3b>(i, j) * 1.2; } } }
效果可以说是很明显了。
OpenCV 提供了一种更加便捷的遍历像素的方法,以后再补充吧,忒难了。