Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 平均池C++;错误 #包括“opencv2/core/core.hpp” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/highgui.hpp” #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; #将ATD定义为 垫平均池2x2(垫垫,整数填充) { int width_remain=mat.cols%2; int high_remain=mat.rows%2; Mat_new; 如果(宽度=0和高度=0) 材料副本(材料新); 其他的 { if(padding_mathed==1)//有效 { Rect roi=Rect(0,0,mat.cols-剩余宽度,mat.rows-剩余高宽度); mat(roi)、copyTo(mat_new); } 否则// { 材料副本(材料新); 如果(保持高值!=0) { Mat row_add=cv::Mat::zero(保持高位,Mat_new.cols,Mat_new.type()); 材料新。推回(行添加); } 如果(宽度_剩余!=0) { Mat col_add=cv::Mat::zero(宽度保持不变,Mat_new.rows,Mat_new.type()); mat_new=mat_new.t(); 材料新。推回(列添加); mat_new=mat_new.t(); } } } Mat res(Mat_new.cols/2、Mat_new.rows/2、Mat_new.type()、Scalar::all(0)); if(mat_new.channels()==3) { for(int i=0;i_C++_Opencv_Pooling - Fatal编程技术网

C++ 平均池C++;错误 #包括“opencv2/core/core.hpp” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/highgui.hpp” #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; #将ATD定义为 垫平均池2x2(垫垫,整数填充) { int width_remain=mat.cols%2; int high_remain=mat.rows%2; Mat_new; 如果(宽度=0和高度=0) 材料副本(材料新); 其他的 { if(padding_mathed==1)//有效 { Rect roi=Rect(0,0,mat.cols-剩余宽度,mat.rows-剩余高宽度); mat(roi)、copyTo(mat_new); } 否则// { 材料副本(材料新); 如果(保持高值!=0) { Mat row_add=cv::Mat::zero(保持高位,Mat_new.cols,Mat_new.type()); 材料新。推回(行添加); } 如果(宽度_剩余!=0) { Mat col_add=cv::Mat::zero(宽度保持不变,Mat_new.rows,Mat_new.type()); mat_new=mat_new.t(); 材料新。推回(列添加); mat_new=mat_new.t(); } } } Mat res(Mat_new.cols/2、Mat_new.rows/2、Mat_new.type()、Scalar::all(0)); if(mat_new.channels()==3) { for(int i=0;i

C++ 平均池C++;错误 #包括“opencv2/core/core.hpp” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/highgui.hpp” #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; #将ATD定义为 垫平均池2x2(垫垫,整数填充) { int width_remain=mat.cols%2; int high_remain=mat.rows%2; Mat_new; 如果(宽度=0和高度=0) 材料副本(材料新); 其他的 { if(padding_mathed==1)//有效 { Rect roi=Rect(0,0,mat.cols-剩余宽度,mat.rows-剩余高宽度); mat(roi)、copyTo(mat_new); } 否则// { 材料副本(材料新); 如果(保持高值!=0) { Mat row_add=cv::Mat::zero(保持高位,Mat_new.cols,Mat_new.type()); 材料新。推回(行添加); } 如果(宽度_剩余!=0) { Mat col_add=cv::Mat::zero(宽度保持不变,Mat_new.rows,Mat_new.type()); mat_new=mat_new.t(); 材料新。推回(列添加); mat_new=mat_new.t(); } } } Mat res(Mat_new.cols/2、Mat_new.rows/2、Mat_new.type()、Scalar::all(0)); if(mat_new.channels()==3) { for(int i=0;i,c++,opencv,pooling,C++,Opencv,Pooling,如果打开错误消息引用的文件,您将看到ptr()方法定义如下: #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <math.h> #include <fstream> #include <iostream> using namespace cv; using namespa

如果打开错误消息引用的文件,您将看到
ptr()
方法定义如下:

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <math.h>
#include <fstream>
#include <iostream>
using namespace cv;
using namespace std;
#define ATD at<double>

Mat average_pooling2x2(Mat mat, int padding_mathed)
{
int width_remain = mat.cols % 2;
int high_remain = mat.rows % 2;

Mat mat_new;
if (width_remain == 0 && high_remain == 0)
    mat.copyTo(mat_new);
else
{
    if (padding_mathed == 1)//valid
    {
        Rect roi = Rect(0, 0, mat.cols - width_remain, mat.rows - high_remain);
        mat(roi).copyTo(mat_new);
    }
    else //same
    {
        mat.copyTo(mat_new);
        if (high_remain != 0)
        {
            Mat row_add = cv::Mat::zeros(high_remain, mat_new.cols,mat_new.type());
            mat_new.push_back(row_add);
        }
        if (width_remain != 0)
        {
            Mat col_add = cv::Mat::zeros(width_remain, mat_new.rows, mat_new.type());
            mat_new = mat_new.t();
            mat_new.push_back(col_add);
            mat_new = mat_new.t();
        }
    }
}

Mat res(mat_new.cols / 2, mat_new.rows / 2, mat_new.type(), Scalar::all(0));


if (mat_new.channels() ==3)
{  


    for (int i = 0; i < res.rows; i++)//this is where error happened
    {
        uchar *data_res = res.ptr<uchar>(i);
        uchar * data = mat_new.ptr<uchar>(2*i);
        uchar * data1 = mat_new.ptr<uchar>(2*i+1);
        for (int j = 0; j < res.cols*res.channels(); j = j + 3)
        {
            data_res[j] = (data[j*2] + data[j*2+3] + data1[j*2] + data1[j*2+3]) / 4;
            data_res[j + 1] = (data[j*2+1] + data[j*2+4] + data1[j*2+1] + data1[j*2+4]) / 4;
            data_res[j + 2] = (data[j*2+2] + data[j*2+5] + data1[j*2+2] + data1[j*2+5]) / 4;

        }
    }

}

else
{
    for (int i = 0; i<res.rows; i++)
    {
        for (int j = 0; j<res.cols; j++)
        {
            Mat temp;
            Rect roi = Rect(j * 2, i * 2, 2, 2);
            mat_new(roi).copyTo(temp);
            double val;
            val = sum(temp)[0] / (2 * 2);
            res.ATD(i, j) = val;
        }
    }

}

return res;


}


int main(int argc, char** argv)
{
    Mat image = imread("C://Users//Administrator//Desktop//11.jpg");
    imshow("???", image);
    Mat pooling_image;
    average_pooling2x2(image, 2).copyTo(pooling_image);
    imshow("???", pooling_image);
    waitKey();
    return 0;
}
此循环也会崩溃,因为
data\u res
只有
res.cols
列,并且您允许j访问
res.cols*res.channels()-1

uchar * data = mat_new.ptr<uchar>(2*i);
uchar * data1 = mat_new.ptr<uchar>(2*i+1);
您可能意外地交换了参数-
res
mat_new.cols/2
行,而我认为您希望它是
mat_new.rows/2

您标记为“这是发生错误的地方”的行无法导致所述错误,因为它只包含整数运算。很可能发生在下面的某个位置。例如,在
mat_new.ptr(2*i+1)
。对我来说,
mat\u new
的行数是否是
res
的两倍并不明显。此外,你应该正确命名变量,伪名称,如
data
data1
i
j
只是一条失败的捷径。
uchar * data = mat_new.ptr<uchar>(2*i);
uchar * data1 = mat_new.ptr<uchar>(2*i+1);
for (int j = 0; j < res.cols*res.channels(); j = j + 3)
        {
            data_res[j] = (data[j*2] + data[j*2+3] + data1[j*2] + data1[j*2+3]) / 4;
            data_res[j + 1] = (data[j*2+1] + data[j*2+4] + data1[j*2+1] + data1[j*2+4]) / 4;
            data_res[j + 2] = (data[j*2+2] + data[j*2+5] + data1[j*2+2] + data1[j*2+5]) / 4;

        }
Mat res(mat_new.cols / 2, mat_new.rows / 2, mat_new.type(), Scalar::all(0));