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

标签 c++ arrays opencv pointers

您好我正在尝试缩放 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;
        }
    }
}
但是添加边界检查条件会很棒,希望你能管理它:)

关于c++ - 使用 OpenCV 在 C++ 中缩放图像,但不使用 pyrDown() 或 pyrUp() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64297662/

相关文章:

c++ - 比较网络摄像头帧时,cvNorm() 总是返回 0

c++ - 如何使用 Boost 库实现 SortedVector API?

C++中断线程等待用户输入

c++ - 绑定(bind)到私有(private)继承的成员函数

c++ - 在数组的列中查找最大值并在同一行中打印其他对应值

C++ 标准库堆栈使用。无法推送 float 数组

C++ 模板 : C2143 error in VS2017 but compiles in VS2013

c - 扫描 C 中的值直到遇到换行符, '\n'

c++ - OpenCV 自适应阈值处理 HSV 图像

c++ - OpenCV - 使用 SURF 描述符和 BruteForceMatcher 进行对象匹配