微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用OpenCV在C ++中缩放图像,但不使用pyrDown或pyrUp函数

如何解决使用OpenCV在C ++中缩放图像,但不使用pyrDown或pyrUp函数

您好,我正在尝试缩放x2图像以减小或增加它,但是我不允许在代码调用pyr函数。到目前为止,这是我减少图像的方法

cv::Mat Pyramid::calcpyramid(cv::Mat image)
{
    int channels = image.channels();
    int rows = image.rows;
    int cols = image.cols*image.channels();

    cv::Mat calculada(image.rows/2,image.cols/2,CV_8UC3);
    
    uchar* prixelPtr = (uchar*)image.data;

    for(int iRows = 0; iRows < rows; iRows++)
    {
        for(int iCols=0; iCols < cols; iCols++)
        {
            uchar blue = prixelPtr[ 2*iRows*image.cols*channels + 2*iCols*channels + 0];
            uchar green = prixelPtr[ 2*iRows*image.cols*channels + 2*iCols*channels + 1];
            uchar red = prixelPtr[ 2*iRows*image.cols*channels + 2*iCols*channels + 2];

            calculada.at<cv::Vec3b>(iRows,iCols)[0] = blue;
            calculada.at<cv::Vec3b>(iRows,iCols)[1] = green;
            calculada.at<cv::Vec3b>(iRows,iCols)[2] = red;
        }
    }
    return calculada;
}

我在终端上遇到的错误是:分段错误(核心已转储)。如何修复代码? 谢谢!

解决方法

代码很简单:

src和dst必须是单独的图像,而不是同一矩阵。

void pyrDown(cv::Mat& src,cv::Mat& dst)
{
    dst = cv::Mat(src.rows / 2,src.cols / 2,CV_8UC3);
    for (int i = 0; i < src.rows/2; ++i)
    {
        for (int j = 0; j < src.cols/2; ++ j)
        {
            // sample 4 points from source image
            cv::Vec3f p11 = src.at<cv::Vec3b>(i * 2,j * 2);
            cv::Vec3f p12 = src.at<cv::Vec3b>(i * 2,j * 2+1);
            cv::Vec3f p21 = src.at<cv::Vec3b>(i * 2+1,j * 2);
            cv::Vec3f p22 = src.at<cv::Vec3b>(i * 2+1,j * 2+1);
            // find mean (we want to keep as much information as possible)
            cv::Vec3f p_dst = (p11 + p12 + p21 + p22) / 4.0f;
            // put result to destination image
            dst.at<cv::Vec3b>(i,j) = p_dst;
        }
    }
}

但是添加边界检查条件将是很棒的,希望您能加以管理:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。