当前位置: 首页 > 工具软件 > Crop Image > 使用案例 >

opencv c++中对图像进行crop操作的方法

锺离刚洁
2023-12-01

在python里面,opencv的mat是按numpy数据的形式存储的,所以crop的时候可以直接对Mat进行切片操作,就能够的得到crop后的图像。

但是在c++中,像python那样类似切片的方法crop,得到的只是指向crop位置的指针,如果希望在crop后的Mat做更改时,结果能够应用到原图像,可以用下面的方法进行crop:

//area为切割区域的左上角坐标和宽高
void crop_img(cv::Mat &img, cv::Mat &crop_img, std::vector<int> &area) {
    int crop_x1 = std::max(0, area[0]);
    int crop_y1 = std::max(0, area[1]);
    int crop_x2 = std::min(img.cols -1, area[0] + area[2] - 1);
    int crop_y2 = std::min(img.rows - 1, area[1] + area[3] - 1);

    crop_img = img(cv::Range(crop_y1, crop_y2+1), cv::Range(crop_x1, crop_x2 + 1));
}

这样crop_img即为切割后的头指针,而如果不希望对crop_img进行修改后,img也发生对应的变化,那么需要把crop后的Mat复制到新的Mat上去:

//area为切割区域的左上角坐标和宽高
void crop_image(cv::Mat &img, cv::Mat &crop_im, std::vector<int> &area)
{
    int crop_x1 = std::max(0, area[0]);
    int crop_y1 = std::max(0, area[1]);
    int crop_x2 = std::min(img.cols -1, area[0] + area[2] - 1);
    int crop_y2 = std::min(img.rows - 1, area[1] + area[3] - 1);
    
    crop_im = cv::Mat::zeros(area[3], area[2], 16);
    cv::Mat crop_im_window = crop_im(cv::Range(crop_y1 - area[1], crop_y2+1 - area[1]), cv::Range(crop_x1 - area[0], crop_x2 + 1 - area[0]));
    cv::Mat roi_img = img(cv::Range(crop_y1, crop_y2+1), cv::Range(crop_x1, crop_x2 + 1));
    crop_im_window += roi_img;
}
 类似资料: