【问题标题】:Crop image with OpenCV\C++使用 OpenCV\C++ 裁剪图像
【发布时间】:2020-10-18 13:34:15
【问题描述】:

我正在使用 OpenCV(v 2.4.9.1,Ubuntu 16.04)对图像进行调整大小和裁剪,原始图像是尺寸为 640x480 的 JPEG 文件。

cv::Mat _aspect_preserving_resize(const cv::Mat& image, int target_width)
{
    cv::Mat output;
    int min_dim = ( image.cols >= image.rows ) ? image.rows : image.cols;
    float scale = ( ( float ) target_width ) / min_dim;
    cv::resize( image, output, cv::Size(int(image.cols*scale), int(image.rows*scale)));
    return output;
}

cv::Mat _center_crop(cv::Mat& image, cv::Size& input_size) 
{
    cv::Rect myROI(int(image.cols/2-input_size.width/2), int(image.rows/2-input_size.height/2), input_size.width, input_size.height);
    cv::Mat croppedImage = image(myROI);
    return croppedImage;
}

int min_input_size = int(input_size.height * 1.14);
cv::Mat image = cv::imread("power-dril/47105738371_72f83eeb37_z.jpg");
cv::Mat output = _aspect_preserving_resize(image, min_input_size);
cv::Mat result = _center_crop(output, input_size);

在此之后我显示图像,它看起来很完美 - 正如我所期望的那样:

问题出现在我流式传输此图像时,我注意到裁剪图像的大小(以元素为单位)仅为我预期的三分之一。看起来好像在所得作物上只有一个通道。它应该有224*224*3=150528,但我在做的时候只得到50176

std::cout << cropped_image.total() << " " << cropped_image.type() << endl;
>>> 50176 16

知道这里有什么问题吗?生成的cv::Mat的类型看起来还行,视觉上也还行,怎么只有一个通道呢?

提前致谢。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    Basic Structures — OpenCV 2.4.13.7 documentation 说:

    垫子::总计

    返回数组元素的总数。

    C++: size_t Mat::total() const

    该方法返回数组元素的数量(如果 数组代表一个图像)。

    因此,返回值为224*224=50176的像素数,而你的预期值是错误的。

    【讨论】:

    • 感谢@MikeCAT,当我在裁剪之前打印total() 时,我确实得到了我期望的值。有没有办法保存\保持\保留数据通道?编辑:当我打电话给channels() 时,我确实得到了3
    【解决方案2】:

    正如@MikeCAT 所指出的,我的术语是错误的,似乎应该在序列化逻辑中解决这个问题。我按照这个思路提出了一个解决方案: Convert Mat to Array/Vector in OpenCV

    我的原始代码没有检查channels() 函数。

    if (curr_img.isContinuous()) {
        int totalsz = curr_img.dataend-curr_img.datastart;
        array.assign(curr_img.datastart, curr_img.datastart + totalsz);
    } else {
        int rowsz = CV_ELEM_SIZE(curr_img.type()) * curr_img.cols;
        for (int i = 0; i < curr_img.rows; ++i) {
            array.insert(array.end(), curr_img.ptr<uint8_t>(i), curr_img.ptr<uint8_t>(i) + rowsz);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多