分段错误,找不到我做错的地方
Segmentation fault, can't find where I did wrong
我找不到我的 raspberry 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 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;
}
这可能不是唯一的问题,但当您将 x
传递给 cvCvtColor
时,它未被初始化。您传递给 cvCvtColor 的 dst
指针需要指向 "The destination image of the same data type as the source one."(来自 this page)
这意味着 cvCvtColor
调用将写入内存中的随机位置,可能立即或稍后导致崩溃。
除以上几点外:
为什么在同一个函数调用中传递 'x' 和 'x' 本身的地址。
cvInRangeS(>>&x<<, cvScalar(0,137,171), cvScalar(48,256,248), >>x<<;
其中一个似乎不正确。通过传入&x,你打算分配space并设置指针。既然如此,为什么要单独传入'x'
在cvInRangeS()的主体中,第二个x将指向未初始化的内存,即使您填写对应于第一个参数的指针。
这是因为所有参数都被计算并传入,包括调用时存在的最后一个参数。第一个参数 '&x' 实现了更新调用者视图的副作用,但是,它在第二个参数的正文中不可用。
我找不到我的 raspberry 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 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;
}
这可能不是唯一的问题,但当您将 x
传递给 cvCvtColor
时,它未被初始化。您传递给 cvCvtColor 的 dst
指针需要指向 "The destination image of the same data type as the source one."(来自 this page)
这意味着 cvCvtColor
调用将写入内存中的随机位置,可能立即或稍后导致崩溃。
除以上几点外:
为什么在同一个函数调用中传递 'x' 和 'x' 本身的地址。
cvInRangeS(>>&x<<, cvScalar(0,137,171), cvScalar(48,256,248), >>x<<;
其中一个似乎不正确。通过传入&x,你打算分配space并设置指针。既然如此,为什么要单独传入'x'
在cvInRangeS()的主体中,第二个x将指向未初始化的内存,即使您填写对应于第一个参数的指针。
这是因为所有参数都被计算并传入,包括调用时存在的最后一个参数。第一个参数 '&x' 实现了更新调用者视图的副作用,但是,它在第二个参数的正文中不可用。