C语言 使用NI VISION imaqDetectLines()函数时的一般保护错误



我在LabwindowsCVI中使用National Instruments Vision模块

由于某种原因,当我使用函数imaqDetectLines()时,我得到FATAL RUN-TIME ERROR: "Angle tracker.c", line 50, col 11, thread id 0x00002004: The program has caused a 'General Protection' fault at 0x6C5AD446.

这是我的代码:

#include "nivision.h"
#include <userint.h>
#include <cvirte.h>
int main (int argc, char *argv[])
{
    int nLines;
    ShapeDetectionOptions stShapeDetectionOption;
    RangeFloat aAngleRanges[2]={{0,10.0},{10.0,20.0}};
    CurveOptions stCurveOptions = {0};
    LineMatch *aLm;
    LineDescriptor lineDesc;
    Image *imageHdl = NULL, *imageDestHdl = NULL;
    char temp[1024] ="";
    if (InitCVIRTE (0, argv, 0) == 0)
        return -1;    /* out of memory */
    imageHdl = imaqCreateImage (0/*U8*/,1); 
    imageDestHdl = imaqCreateImage (0/*U8*/,1); 
    strcpy(temp,"C:\CVI2013\Projects\Angel Tracker\IMG\CC01.bmp");
    imaqReadFile (imageHdl, temp, NULL, NULL);
    imaqEdgeFilter (imageDestHdl, imageHdl, IMAQ_EDGE_SOBEL, NULL);
    lineDesc.maxLength = 100;
    lineDesc.minLength = 50;
    stShapeDetectionOption.minMatchScore = 1;
    stShapeDetectionOption.mode = 0;
    stShapeDetectionOption.numAngleRanges = 1;
    stShapeDetectionOption.angleRanges = aAngleRanges;
    stShapeDetectionOption.scaleRange.minValue = 1;
    stShapeDetectionOption.scaleRange.maxValue = 10;
    stCurveOptions.extractionMode = 0;
    stCurveOptions.threshold = 100;
    stCurveOptions.filterSize = 1;
    stCurveOptions.minLength = 100;
    stCurveOptions.rowStepSize = 10;
    stCurveOptions.columnStepSize = 10;
    stCurveOptions.maxEndPointGap = 1000;
    stCurveOptions.onlyClosed = TRUE;
    stCurveOptions.subpixelAccuracy = TRUE;
    aLm = imaqDetectLines(imageDestHdl, &lineDesc, &stCurveOptions
                           ,&stShapeDetectionOption, NULL, &nLines);
    return 0;
}

我实际做的是:

  1. 打开BMP文件

  2. 使用SOBEL对imaqEdgeFilter()函数进行边缘滤波

  3. 然后我想用imaqDetectLines()函数检测行

我找到问题了。

如果你看函数调用:

aLm = imaqDetectLines(imageDestHdl, &lineDesc, &stCurveOptions
                       ,&stShapeDetectionOption, NULL, &nLines);   

对于ROI参数,我传递了NULL,因为我从功能面板帮助中得到了这个:

应用于图像的感兴趣区域,指定可以检测到圆的位置。将此参数设置为NULL以搜索整个图像。

但是,显然这是一个已知的错误,它将被修复,所以为了解决这个问题,只需执行以下操作:

ROI *roi;    
imaqSetWindowROI (0, NULL);    
roi = imaqGetWindowROI (0);  

然后发送给函数:

aLm = imaqDetectLines(imageDestHdl, &lineDesc, &stCurveOptions
                       ,&stShapeDetectionOption, roi, &nLines);  

相关内容

  • 没有找到相关文章

最新更新