C 严重破裂和泄漏

C 严重破裂和泄漏,c,opencv,C,Opencv,我有一个基本上检测扑克牌的代码,根据HSV设置将它们从动态背景中分离出来,然后使用轮廓来检测扑克牌的4个点,以找到扑克牌的确切x和y位置。从那里,投资回报率设置,我可以执行进一步的处理,以检测卡的面值 然而,我认为代码似乎正在崩溃,我似乎无法找到它的根本原因。 我已清除了图像和内存存储,我已确保所有Iplimages具有相同的格式和分辨率 IplImage* GetThresholdedImage(IplImage* imgHSV){ IplImage* imgThresh=cvCre

我有一个基本上检测扑克牌的代码,根据HSV设置将它们从动态背景中分离出来,然后使用轮廓来检测扑克牌的4个点,以找到扑克牌的确切x和y位置。从那里,投资回报率设置,我可以执行进一步的处理,以检测卡的面值

然而,我认为代码似乎正在崩溃,我似乎无法找到它的根本原因。 我已清除了图像和内存存储,我已确保所有Iplimages具有相同的格式和分辨率

IplImage* GetThresholdedImage(IplImage* imgHSV){ 
    IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
    cvInRangeS(imgHSV, cvScalar(95,67,170), cvScalar(110,119,254), imgThresh); //Morning
    return imgThresh;
} 

IplImage* RedCheck(IplImage* imgBGR){ 
    IplImage* img=cvCreateImage(cvGetSize(imgBGR),IPL_DEPTH_8U, 1);
    cvInRangeS(imgBGR, cvScalar(0,0,100), cvScalar(100,100,254), img); //BGR
    return img;
} 

int main()
{
    CvCapture* capture =0;
    capture = cvCaptureFromCAM(0);
    if(!capture)
    {
        printf("Capture failure\n");
        return -1;
    }

    IplImage* frame = cvCreateImage(cvSize(48,64),IPL_DEPTH_8U,3);

    while(true)
    {
        frame = cvQueryFrame(capture); 
        if(!frame) break;

        frame=cvCloneImage(frame); 
        cvSmooth(frame, frame, CV_GAUSSIAN,3,3); //smooth the original image using Gaussian kernel
        IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); 
        cvCvtColor(frame, imgHSV, CV_BGR2HSV); //Change the color format from BGR to HSV
        IplImage* imgThresh = GetThresholdedImage(imgHSV);

        cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3); //smooth the binary image using Gaussian kernel

        CvSeq* contours;
        CvSeq* result;
        CvMemStorage *storage = cvCreateMemStorage(0);
        cvFindContours(imgThresh, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
        while(contours)
        {

            result = cvApproxPoly(contours, sizeof(CvContour),storage,CV_POLY_APPROX_DP,cvContourPerimeter(contours)*0.02,0);
            if(result->total == 4)
            {
                CvPoint *pt[4];
                for(int i=0;i<4;i++)
                {
                    pt[i] = (CvPoint*)cvGetSeqElem(result,i);
                }
                if (cvArcLength(result,CV_WHOLE_SEQ,1) >= 400)
                {
                    cvLine(imgThresh,*pt[0],*pt[1],cvScalar(255,0,0),4);
                    cvLine(imgThresh,*pt[1],*pt[2],cvScalar(255,0,0),4);
                    cvLine(imgThresh,*pt[2],*pt[3],cvScalar(255,0,0),4);
                    cvLine(imgThresh,*pt[3],*pt[0],cvScalar(255,0,0),4);



                    int ROIwidth = abs((*pt[0]).x - (*pt[1]).x);
                    int ROIheight = abs((*pt[1]).y - (*pt[2]).y);


                    cvSetImageROI(frame,cvRect((*pt[1]).x,(*pt[1]).y,ROIwidth,ROIheight));
                    IplImage* temp = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
                    cvCopy(frame,temp,0);
                    cvResetImageROI(frame);
                    cvNamedWindow( "ROI", CV_WINDOW_AUTOSIZE );
                    cvShowImage( "ROI", temp);
                    printf("Width = %d\n",ROIwidth); //255-275
                    printf("Height = %d\n",ROIheight); //140-160
                    //Card Value Detection Starts Here


                    IplImage* colorcheck = RedCheck(temp);

                    int redpixelcheck = cvCountNonZero(colorcheck);
                    if (redpixelcheck <= 15)
                    {
                        printf("Card is Black\n");


                    }
                    else if (redpixelcheck >= 16)
                    {
                        printf("Card is Red\n");
                    }


                    //Card Value Detection Ends Here

                    cvReleaseImage(&temp);
                    cvReleaseImage(&frame);
                    cvReleaseImage(&colorcheck);


                    delete &ROIwidth;
                    delete &ROIheight;
                    delete &redpixelcheck;

                }
                //delete [] pt[4];
            }
            delete &result;
            contours = contours->h_next;
            //cvPutText (frame_t,text,cvPoint(200,400), &font, cvScalar(255,255,0));
        }

        cvNamedWindow( "Contour", CV_WINDOW_AUTOSIZE );
        cvShowImage( "Contour", imgThresh);
        cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);
        cvShowImage("Video", frame);

        //Clean up used images

        cvReleaseImage(&imgHSV);
        cvReleaseImage(&imgThresh); 
        cvReleaseImage(&frame);

        cvClearMemStorage(storage);
        cvReleaseMemStorage(&storage);

        //Wait 50mS
        int c = cvWaitKey(10);
        //If 'ESC' is pressed, break the loop
        if((char)c==27 ) break; 
    }
        cvDestroyAllWindows() ;
        cvReleaseCapture(&capture);
        return 0;
    }
IplImage*GetThresholdedImage(IplImage*imgHSV){
IplImage*imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U,1);
cvInRangeS(imgHSV,cvScalar(95,67170),cvScalar(110119254),imgThresh);//早晨
返回imgThresh;
} 
IplImage*RedCheck(IplImage*imgBGR){
IplImage*img=cvCreateImage(cvGetSize(imgBGR),IPL_DEPTH_8U,1);
cvInRangeS(imgBGR,cvScalar(0,0100),cvScalar(100100254),img);//BGR
返回img;
} 
int main()
{
CvCapture*capture=0;
捕获=cvCaptureFromCAM(0);
如果(!捕获)
{
printf(“捕获失败\n”);
返回-1;
}
IplImage*frame=cvCreateImage(cvSize(48,64),IPL_DEPTH_8U,3);
while(true)
{
帧=cvQueryFrame(捕获);
如果(!帧)中断;
frame=cvCloneImage(frame);
cvSmooth(frame,frame,CV_GAUSSIAN,3,3);//使用高斯核平滑原始图像
IplImage*imgHSV=cvCreateImage(cvGetSize(帧),IPL_DEPTH_8U,3);
CVTColor(帧、imgHSV、CV_BGR2HSV);//将颜色格式从BGR更改为HSV
IplImage*imgThresh=getthresholdemage(imgHSV);
cvSmooth(imgThresh,imgThresh,CV_GAUSSIAN,3,3);//使用高斯核对二值图像进行平滑
CvSeq*等高线;
CvSeq*结果;
CvMemStorage*storage=cvCreateMemStorage(0);
cvFindContours(imgThresh、storage和contours、sizeof(CvContours)、CV_RETR_列表、CV_CHAIN_近似值、cvPoint(0,0));
while(等高线)
{
结果=cvApproxPoly(等高线、尺寸(CvContour)、存储、CV_POLY_近似_DP、CVContourp周长(等高线)*0.02,0);
如果(结果->总计==4)
{
CvPoint*pt[4];
对于(int i=0;i=400)
{
cvLine(imgThresh,*pt[0],*pt[1],cvScalar(255,0,0),4);
cvLine(imgThresh,*pt[1],*pt[2],cvScalar(255,0,0),4);
cvLine(imgThresh,*pt[2],*pt[3],cvScalar(255,0,0),4);
cvLine(imgThresh,*pt[3],*pt[0],cvScalar(255,0,0),4);
int ROIwidth=abs(*pt[0]).x-(*pt[1]).x);
内部高度=绝对高度(*pt[1]).y-(*pt[2]).y);
cvSetImageROI(帧,cvRect((*pt[1]).x,(*pt[1]).y,ROIwidth,ROIheight));
IplImage*temp=cvCreateImage(cvGetSize(帧),IPL_深度_8U,3);
cvCopy(帧,温度,0);
cvResetImageROI(帧);
cvNamedWindow(“ROI”,CV\u窗口\u自动调整大小);
cvShowImage(“ROI”,温度);
printf(“宽度=%d\n”,宽度);//255-275
printf(“高度=%d\n”,ROIheight);//140-160
//卡值检测从这里开始
IplImage*颜色检查=红色检查(温度);
int redpixelcheck=cvCountNonZero(colorcheck);
如果(红色像素检查=16)
{
printf(“卡片为红色\n”);
}
//卡值检测到此结束
cvReleaseImage(&temp);
cvReleaseImage(&frame);
cvReleaseImage(彩色检查);
删除&roi宽度;
删除&删除高度;
删除&redpixelcheck;
}
//删除[]pt[4];
}
删除&结果;
轮廓=轮廓->h_下一步;
//cvPutText(frame_t,text,cvPoint(200400),&font,cvScalar(255255,0));
}
cvNamedWindow(“轮廓”,CV_窗口_自动调整大小);
cvShowImage(“轮廓”,imgThresh);
cvNamedWindow(“视频”,CV_窗口_自动调整大小);
cvShowImage(“视频”,帧);
//清理使用过的图像
cvReleaseImage(&imgHSV);
cvReleaseImage(&imgThresh);
cvReleaseImage(&frame);
cvClearMemStorage(存储);
cvReleaseMemStorage(&storage);
//等待50毫秒
int c=cvWaitKey(10);
//如果按下“ESC”,则断开循环
如果((char)c==27)中断;
}
cvallwindows();
cvReleaseCapture(&capture);
返回0;
}
反汇编总是指向同一地址
770915DE添加esp,4

编写在线扑克/黑杰克机器人你是谁?:)删除&结果;指向C++样式库(以及调用Delphi的一种非常奇怪的方法,可能是错误)。这是一个C或C++应用程序吗?如果你正在写一个扑克/ Black Jack机器人,你可能会使用错误的语言作为工具。试试ruby、python或其他你给我的东西Michael。它是C语言。我对其他语言没有太多经验或知识。
int-ROIwidth
声明了一个普通的
int
自动存储持续时间<代码>删除&删除宽度不会编译为C,而在C++中,则会导致中断。代码>删除仅删除您
新增的内容
ed。