0

我正在尝试在 c++ 中使用 opencv 检测对象,但出现错误:project1.exe 中 0x52f9e470 处的未处理异常:0xC000001D:非法指令。

使用 windows 7 32 位,opencv 2.4.3,visual studio (c++) 2010,我的代码是:

   #include <opencv\cv.h>
   #include <opencv\highgui.h>
   #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
   #include <math.h>
   #include <float.h>
    #include <limits.h>
   #include <time.h>
   #include <ctype.h>


      // Create a string that contains the exact cascade name
     // Contains the trained classifer for detecting hand
    const char *cascade_name="D:/31dec12/hand.xml";

    //The function detects the hand from input frame and draws a rectangle around the         detected portion of the frame
    void detect_and_draw( IplImage* img )
    {

    // Create memory for calculations
    static CvMemStorage* storage = 0;

    // Create a new Haar classifier
    static CvHaarClassifierCascade* cascade = 0;

   // Sets the scale with which the rectangle is drawn with
   int scale = 1;

   // Create two points to represent the hand locations
   CvPoint pt1, pt2;

    // Looping variable
    int i; 

    // Load the HaarClassifierCascade
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

    // Check whether the cascade has loaded successfully. Else report and error and       quit
    if( !cascade )
    {
      fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
     return;
     }

    // Allocate the memory storage
    storage = cvCreateMemStorage(0);

    // Create a new named window with title: result
     cvNamedWindow( "result", 1 );

    // Clear the memory storage which was used before
    cvClearMemStorage( storage );

    // Find whether the cascade is loaded, to find the hands. If yes, then:
    if( cascade )
    {

       // There can be more than one hand in an image. So create a growable sequence of hands.
      // Detect the objects and store them in the sequence
      CvSeq* hands = cvHaarDetectObjects( img, cascade, storage,
                                        1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                        cvSize(40, 40) );

      // Loop the number of hands found.
      for( i = 0; i < (hands ? hands->total : 0); i++ )
      {
        // Create a new rectangle for drawing the hand
         CvRect* r = (CvRect*)cvGetSeqElem( hands, i );

          // Find the dimensions of the hand,and scale it if necessary
          pt1.x = r->x*scale;
         pt2.x = (r->x+r->width)*scale;
         pt1.y = r->y*scale;
         pt2.y = (r->y+r->height)*scale;

         // Draw the rectangle in the input image
         cvRectangle( img, pt1, pt2, CV_RGB(230,20,232), 3, 8, 0 );
       }
     }

     // Show the image in the window named "result"
      cvShowImage( "result", img );


    }


    // A Simple Camera Capture Framework
     int main()
    {

     // Gets the input video stream from camera
     CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );

     // Checks if the input stream is obtained
     if( !capture ) 
  {
    fprintf( stderr, "ERROR: capture is NULL \n" );
    getchar();
    return -1;
  }

   // Show the image captured from the camera in the window and repeat
 while( 1 )
  {

    // Get one frame
     IplImage* frame = cvQueryFrame( capture );

    // Cecks if a frame is obtained
    if( !frame )
    {
    fprintf( stderr, "ERROR: frame is null...\n" );
    getchar();
    break;
   }

  // Flips the frame into mirror image 
  cvFlip(frame,frame,1);

   // Call the function to detect and draw the hand positions
    detect_and_draw(frame);

    //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
   //remove higher bits using AND operator
    if( (cvWaitKey(10) & 255) == 27 ) 
    break;
   }

   // Release the capture device housekeeping
    cvReleaseCapture( &capture );

   return 0;
    }
4

2 回答 2

6

你用的是什么类型的cpu?上次我遇到错误:0xC000001D:非法指令与代码中使用的 SSE 指令有关。一些新的 SSE 指令未在 AMD 处理器上实现,例如,因此您可以通过在没有 SSE 支持的情况下重建 opencv 来解决此问题。

于 2013-01-19T00:17:31.253 回答
2

使用 cv::Mat(...) 时我也有这个问题

同样的异常抛出 size_t esz = CV_ELEM_SIZE(_type), esz1 = CV_ELEM_SIZE1(_type);

不太清楚为什么,但是在将 Visual C++ Project 浮点模型从精确更改为快速之后,问题就解决了。

于 2017-08-28T10:53:07.977 回答