原理:
1、先提取Mat的特定区域
// 提取原图区域
cv::Mat matRoiTmp = cv::Mat(mat, cv::Rect(100,100,150,100));
2、提取新图的区域,然后把上面提取出来的区域像素,复制到这个区域里面
// 提取新图区域
cv::Mat roiTmp = cv::Mat(roiMat, cv::Rect(100,200,150,100));
// 区域复制
matRoiTmp.copyTo(roiTmp);
完整代码:
c++版本
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src, roi;
src = imread("C:/Users/andy.ke/Desktop/qietu/image/test.png");
namedWindow("原图", WINDOW_AUTOSIZE);
imshow("原图", src);
roi = Mat(src, Rect(100, 200, 100,100));
namedWindow("提取", WINDOW_AUTOSIZE);
imshow("提取", roi);
// 新建一张一样的图片
Mat newSrc;
newSrc.create(src.rows, src.cols, src.type());
src.copyTo(newSrc);
// 提取这个图片的某个区域
Mat tmp = Mat(newSrc, Rect(50, 50, 100, 100));
// 把另一个图片的截图放进这个区域里面
roi.copyTo(tmp);
namedWindow("合成图", WINDOW_AUTOSIZE);
imshow("合成图", newSrc);
waitKey(0);
return 0;
}
IOS版本
//
// ViewController.m
// opencv提取图片的某个区域
//
// Created by TEE on 2019/3/1.
// Copyright © 2019 TEE. All rights reserved.
//
#import "ViewController.h"
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import "UIImage+OpenCV.h"
#import "OpenCV.h"
#import <opencv2/imgcodecs/ios.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"fengjing"];
cv::Mat roiMat, mat;
UIImageToMat(image, mat);
UIImageView *iv = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 300, 300)];
UIImage *yuanimage = MatToUIImage(mat);
iv.image = yuanimage;
[self.view addSubview:iv];
// 创建对象
roiMat.create(mat.cols, mat.rows, mat.type());
mat.copyTo(roiMat);
// 提取原图区域
cv::Mat matRoiTmp = cv::Mat(mat, cv::Rect(100,100,150,100));
// 提取新图区域
cv::Mat roiTmp = cv::Mat(roiMat, cv::Rect(100,200,150,100));
// 区域复制
matRoiTmp.copyTo(roiTmp);
UIImage *newimage = MatToUIImage(roiMat);
UIImageView *iv1 = [[UIImageView alloc]initWithFrame:CGRectMake(50, 500, 300, 300)];
iv1.image = newimage;
[self.view addSubview:iv1];
}
@end