roi即感兴趣的区域。
以下代码将图片左上角的200*200的区域修改为黄色。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <string.h>
#include <sys/mman.h>
#include <assert.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
typedef cv::Point3_<uchar> Pixel;
int main() {
Mat img = imread("in.jpg", IMREAD_UNCHANGED);
Mat subImg = img(Range(0, 200), Range(0, 200));
if (img.empty()) {
printf("No image data \n");
return -1;
}
for (Pixel &p : cv::Mat_<Pixel>(subImg)) {
p.x = 0;
p.y = 255;
p.z = 255;
}
imwrite("out.jpg", img);
return 0;
}
或者使用Mat的copyTo函数:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <string.h>
#include <sys/mman.h>
#include <assert.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("in.jpg", IMREAD_UNCHANGED);
Mat subImg = img(Range(0, 200), Range(0, 200));
Mat gray(200, 200, CV_8UC3, Scalar(0, 0, 255));
if (img.empty()) {
printf("No image data \n");
return -1;
}
gray.copyTo(subImg);
imwrite("out.jpg", img);
return 0;
}
这样我们就可以将图像的某一区域替换为其他图像,如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <string.h>
#include <sys/mman.h>
#include <assert.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("in.jpg", IMREAD_UNCHANGED);
Mat subImg = img(Range(0, 200), Range(0, 200));
Mat a200 = imread("a200.jpg", IMREAD_UNCHANGED);
if (img.empty()) {
printf("No image data \n");
return -1;
}
a200.copyTo(subImg);
imwrite("out.jpg", img);
return 0;
}
上面操作的都是矩形,
那如果我们的roi是圆形或者其他图形,应该怎么操作呢?