为什么此代码返回分段错误错误?

时间:2017-03-31 22:22:36

标签: c++ opencv

我已经实现了以下代码来在矩阵上执行filter2D。编译程序后,它返回Segmentation fault错误。在这个程序中,我想在程序中分配一个输入数组(不想加载图像)。然后执行在程序内部分配的过滤器,以测量运行时不同矩阵和内核的filter2D函数的时间。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;
using namespace cv;

int main(){

    //Picture size for input and output are the same
    int Pxsize = 128;
    int Pysize = Pxsize;

    //Kernel size
    int Kxsize = 3;
    int Kysize = Kxsize;

    //filter arguments
    Point anchor;
    double delta;
    int ddepth;

    //name for out put
    char window_name[32] = "filter2D Demo";


    Mat input[128][128];
    Mat output[128][128];
    Mat kernel[3][3];

    // Initialize arguments for the filter
    anchor = Point( -1, -1 );
    delta = 0;
    ddepth = -1;

    int i,j;
    //assign data between 0 and 255 to the input matrix
    for (i=0; i<Pxsize; i++)
        for (j=0; j<Pysize; j++)
            input[i][j]=(i*j)%255;

    //assign data to the kernel
    //assign data between 0 and 255 to the input matrix
    for (i=0; i<Kxsize; i++)
        for (j=0; j<Kysize; j++)
            kernel[i][j]=1;

    //the problem is here:
    filter2D((InputArray) input,  (OutputArray) output, ddepth , ( InputArray) kernel, anchor, delta, BORDER_DEFAULT );
    namedWindow( window_name, CV_WINDOW_AUTOSIZE );
    imshow( window_name, (OutputArray) output );


    return 0;
}

输出是:

Segmentation fault


------------------
(program exited with code: 139)
Press return to continue

我在Linux mint中使用此命令用于gcc 6.2.0编译器

g++ -Wall -Wextra -Werror -pedantic -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -g -o "opencv"  "opencv.cpp"  -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_stitching
  

编译成功完成

提前致谢

1 个答案:

答案 0 :(得分:1)

根据评论,已发现问题!这是因为在Mat函数中将InputArray对象转换为OutputArrayfilter2D。我将实现更改为以下程序,它可以工作。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <time.h>

//Picture size for input and output are the same
#define MAX1 4096

#define Pxsize MAX1
#define Pysize Pxsize

//Kernel size
#define Kxsize 9
#define Kysize Kxsize
//number of iterations
#define NUM_LOOP 10000

using namespace std;
using namespace cv;

unsigned short int A[Pxsize][Pysize];
unsigned short int B[Pxsize][Pysize];
unsigned short int K[Kxsize][Kysize];

// measuring the time
double pTime = 0, mTime = 10; // to indicate how much program time is (pTime) and how much i want to wait (mTime) 
struct timespec start;


int main(){
    //singleCore
    struct timespec tStart, tEnd;//used to record the processiing time
    double tTotal , tBest=10000;//minimum of toltal time will asign to the best time
    int w=0;

    //filter arguments
    Point anchor;
    double delta;
    int ddepth;

    //assign data between 0 and 255 to the input matrix
    int i,j;
    for (i=0; i<Pxsize; i++)
        for (j=0; j<Pysize; j++)
            A[i][j] = (i+j)%255;

    //assign data to the kernel
    //assign data between 0 and 255 to the input matrix
    for (i=0; i<Kxsize; i++)
        for (j=0; j<Kysize; j++)
            K[i][j]=1;

    cv::Mat input = cv::Mat(Pxsize, Pysize, CV_8UC1, A);
    cv::Mat kernel = cv::Mat::ones(Kxsize, Kysize, CV_8UC1);

    //name for out put

    // Initialize arguments for the filter
    anchor = Point( -1, -1 );
    delta = 0;
    ddepth = -1;

    do{// this loop repeat the body to record the best time
        clock_gettime(CLOCK_MONOTONIC,&tStart);

        //the problem is here:
        filter2D( input,   output, ddepth ,  kernel, anchor, delta, 1 );

        clock_gettime(CLOCK_MONOTONIC,&tEnd);
        tTotal = (tEnd.tv_sec - tStart.tv_sec);
        tTotal += (tEnd.tv_nsec - tStart.tv_nsec) / 1000000000.0;

        if(tTotal<tBest)
            tBest=tTotal;
        pTime += tTotal;
    } while(w++ < NUM_LOOP && pTime < mTime);

    //cout<<" "<< input<<endl;
    //cout<<" "<< output<<endl;
    printf("\nThe best time: %f sec in %d repetition for %dX%d matrix for %d, %d kernel \n",tBest,w, Pxsize, Pysize, Kxsize, Kysize);

    return 0;
}