分段错误,找不到我做错的地方

Segmentation fault, can't find where I did wrong

本文关键字:错误 找不到 分段      更新时间:2023-10-16

我找不到我在覆盖物pi的C 代码中做错的地方,它给了我一个细分错误,但是在寻找4个小时并在这里搜索后,我没发现错误

当程序试图访问不是他的内存时,就会发生我的知识细分错误,但我看不到这在任何地方发生。

我基本上是在尝试使用Raspberry Pi模块找到某个彩色对象

#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <unistd.h>
#include "RaspiCamCV.h"
using namespace cv;
int main(int argc, char *argv[ ]){
    RASPIVID_CONFIG * config = (RASPIVID_CONFIG*)malloc(sizeof(RASPIVID_CONFIG));
    config->width=320;
    config->height=240;
    config->bitrate=0;      // zero: leave as default
    config->framerate=0;
    config->monochrome=0;
    int opt;
    while ((opt = getopt(argc, argv, "lxm")) != -1)
    {
        switch (opt)
        {
            case 'l':                                       // large
                config->width = 640;
                config->height = 480;
                break;
            case 'x':                                       // extra large
                config->width = 960;
                config->height = 720;
                break;
            case 'm':                                       // monochrome
                config->monochrome = 1;
                break;
            default:
                fprintf(stderr, "Usage: %s [-x] [-l] [-m] n", argv[0], opt);
                fprintf(stderr, "-l: Large moden");
                fprintf(stderr, "-x: Extra large moden");
                fprintf(stderr, "-l: Monochrome moden");
                exit(EXIT_FAILURE);
        }
    }
    /*
     Could also use hard coded defaults method: raspiCamCvCreateCameraCapture(0)
     */
    RaspiCamCvCapture * capture = (RaspiCamCvCapture *) raspiCamCvCreateCameraCapture2(0, config);
    free(config);
    CvFont font;
    double hScale=0.4;
    double vScale=0.4;
    int    lineWidth=1;
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale, vScale, 0, lineWidth, 8);
    cvNamedWindow("RaspiCamTest", 1);
    int exit = 0;
    IplImage* x;
    IplConvKernel* erodeElement;
    IplConvKernel* dilateElement;
    printf("start");

    do {
        IplImage* image = raspiCamCvQueryFrame(capture);
        cvCvtColor(image, x, COLOR_BGR2HSV);
        cvInRangeS(&x, cvScalar(0,137,171), cvScalar(48,256,248), x);
        char text[200];
        sprintf(text, "Press ESC to exit");
        cvPutText(x, text, cvPoint(05, 80), &font, cvScalar(255, 255, 0, 0));
        printf("hi");
        erodeElement = cvCreateStructuringElementEx(3,3,-1,-1,MORPH_RECT);
        dilateElement = cvCreateStructuringElementEx(6,6,-1,-1,MORPH_RECT);
        cvErode(x,x,erodeElement);
        cvErode(x,x,erodeElement);
        cvDilate(x,x,dilateElement);
        cvDilate(x,x,dilateElement);

        cvShowImage("RaspiCamTest2", static_cast<CvArr*>(&x));
        cvShowImage("RaspiCamTest", image);
        char key = cvWaitKey(10);
        switch(key)
        {
            case 27:                // Esc to exit
                exit = 1;
                break;
            case 60:                // < (less than)
                raspiCamCvSetCaptureProperty(capture, RPI_CAP_PROP_FPS, 25);    // Currently NOOP
                break;
            case 62:                // > (greater than)
                raspiCamCvSetCaptureProperty(capture, RPI_CAP_PROP_FPS, 30);    // Currently NOOP
                break;
        }
    } while (!exit);
    cvDestroyWindow("RaspiCamTest");
    raspiCamCvReleaseCapture(&capture);
    return 0;
}

这可能不是唯一的问题,但是当您将其传递给 cvCvtColor时, x被非初始化。您传递给CVCVTCOLOR的dst指针需要指向"与源源相同的数据类型的目标图像"。(从此页面)

这个均匀的cvCvtColor调用将写入内存中的随机位置,可能立即或以后引起崩溃。

除了上述点:

为什么在同一函数调用中传递" x"和'x'的地址。

cvinranges(>>&amp; x&lt;&lt;,cvScalar(0,137,171),cvscalar(48,256,248),>> x&lt;

;

其中一个似乎是不正确的。通过传递X,您打算分配空间并设置指针。如果是这样,为什么分别传递'x'。

在cvinranges()的主体内部,第二个X也将您指向非初始化的内存,即使您填写了与第一个参数相对应的指针。

这是因为所有参数均已评估和传递,包括在呼叫时间时存在的最后一个参数。第一个参数'x'实现了更新呼叫者视图的副作用,但是,第二个参数在体内不可用。