Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
分段故障,can';我找不到哪里做错了 我找不到我的树莓PI的C++代码中的错误,它给我一个分割错误,但是在查找了4个小时之后,我在这里找不到错误的< /P>_C++_Opencv_Segmentation Fault_Raspberry Pi - Fatal编程技术网

分段故障,can';我找不到哪里做错了 我找不到我的树莓PI的C++代码中的错误,它给我一个分割错误,但是在查找了4个小时之后,我在这里找不到错误的< /P>

分段故障,can';我找不到哪里做错了 我找不到我的树莓PI的C++代码中的错误,它给我一个分割错误,但是在查找了4个小时之后,我在这里找不到错误的< /P>,c++,opencv,segmentation-fault,raspberry-pi,C++,Opencv,Segmentation Fault,Raspberry Pi,据我所知,当程序试图访问非他的内存时,就会出现分段错误,但我看不到这种情况在任何地方发生 我基本上是想用树莓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[ ]){

据我所知,当程序试图访问非他的内存时,就会出现分段错误,但我看不到这种情况在任何地方发生

我基本上是想用树莓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 mode\n");
                fprintf(stderr, "-x: Extra large mode\n");
                fprintf(stderr, "-l: Monochrome mode\n");
                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;
}
#包括
#包括
#包括
#包括
#包括“RaspiCamCV.h”
使用名称空间cv;
int main(int argc,char*argv[]){
RASPIVID_CONFIG*CONFIG=(RASPIVID_CONFIG*)malloc(sizeof(RASPIVID_CONFIG));
配置->宽度=320;
配置->高度=240;
配置->比特率=0;//零:保留为默认值
配置->帧速率=0;
配置->单色=0;
int-opt;
而((opt=getopt(argc,argv,“lxm”)!=-1)
{
开关(opt)
{
案例“l”://大
配置->宽度=640;
配置->高度=480;
打破
案例“x”://特大型
配置->宽度=960;
配置->高度=720;
打破
大小写'm'://单色
配置->单色=1;
打破
违约:
fprintf(标准,“用法:%s[-x][-l][-m]\n”,argv[0],opt);
fprintf(stderr,“-l:大模式\n”);
fprintf(stderr,“-x:超大模式\n”);
fprintf(标准字符,“-l:单色模式\n”);
退出(退出失败);
}
}
/*
也可以使用硬编码的默认值方法:raspiCamCvCreateCameraCapture(0)
*/
RaspiCamCvCapture*捕获=(RaspiCamCvCapture*)RaspicamcvCreateComeracapture2(0,配置);
免费(配置);
CvFont字体;
双hScale=0.4;
双vScale=0.4;
int线宽=1;
cvInitFont(&font,CV_font_HERSHEY_SIMPLEX,CV_font_ITALIC,hScale,vScale,0,线宽,8);
cvNamedWindow(“RaspiCamTest”,1);
int exit=0;
IplImage*x;
IplConvKernel*元素;
IplConvKernel*元素;
printf(“开始”);
做{
IplImage*图像=raspiCamCvQueryFrame(捕获);
CVT颜色(图像、x、颜色);
cvInRangeS(&x,cvScalar(0137171),cvScalar(48256248),x);
字符文本[200];
sprintf(文本,“按ESC退出”);
cvPutText(x,text,cvPoint(05,80),&font,cvScalar(255,255,0,0));
printf(“hi”);
侵蚀元素=cvCreateStructuringElementEx(3,3,-1,-1,变形矩形);
元素=cvCreateStructuringElementEx(6,6,-1,-1,变形);
CVE腐蚀(x,x,腐蚀元素);
CVE腐蚀(x,x,腐蚀元素);
cvdiplicate(x,x,diplicate元素);
cvdiplicate(x,x,diplicate元素);
cvShowImage(“RaspiCamTest2”,静态投影(&x));
cvShowImage(“RaspiCamTest”,图像);
char key=cvWaitKey(10);
开关(钥匙)
{
案例27://退出Esc
退出=1;
打破
案例60://<(小于)
raspiCamCvSetCaptureProperty(捕获,RPI_CAP_PROP_FPS,25);//当前为NOOP
打破
案例62://>(大于)
raspiCamCvSetCaptureProperty(捕获,RPI_CAP_PROP_FPS,30);//当前为NOOP
打破
}
}同时(!退出);
CVT窗口(“RaspiCamTest”);
raspiCamCvReleaseCapture(&capture);
返回0;
}

这可能不是唯一的问题,但是当您将
x
传递给
cvtcolor
时,
x
未初始化。传递给CVTColor的
dst
指针需要指向“与源图像具有相同数据类型的目标图像。”


这意味着
cvtcolor
调用将写入内存中的随机位置,可能会立即或稍后导致崩溃。

除上述几点外:

为什么在同一个函数调用中传递“x”的地址和“x”本身


cvInRangeS(>>&xxcompiled with-g标志并使用gdb检查seg故障发生的位置x在哪里初始化?就在cvCvtColor(图像,x,颜色)中初始化“do{”行“x之前;”-同样,不是。的第二个参数需要一个有效的内存地址。您正在向它发送一个不确定的地址。该参数应该是“与src大小和深度相同的输出图像”。您没有提供。因为NULL几乎不是“与src大小和深度相同的输出图像”你需要先创建一个图像目标,这样就可以像描述的一样创建图像目标,所以它和源图像的大小和深度相同。为什么你不使用OpenCV的C++绑定来代替C绑定,顺便说一下,或者这个问题是没有标记的?哦,我认为CVCVTFube会初始化X,我会如何去初始化IrasIZIN呢?Gx最快的方式?我从来没有使用过OpenCV,但是谷歌很快找到了这个页面:这表明你应该使用
x=cvCreateImage(cvGetSize(image),8,3)
虽然我不确定
8
3
应该是什么。捕捉得好,
x
应该真正初始化。根据经验法则,总是将指针(至少使用
NULL
nullptr
)和变量初始化到适当的值。OpenCV的C-API不初始化变量(即使是在输出参数的情况下)供您使用。