簡體   English   中英

線程6:EXC_BAD_ACCESS(代碼1,着裝= 0x8)

[英]Thread 6:EXC_BAD_ACCESS(code 1, dress=0x8)

我正在使用iPhone5s進行黑色物體跟蹤:但是經常遇到

Thread 6:EXC_BAD_ACCESS(code 1, dress=0x8) 

然后我的應用突然退出。 誰能告訴我為什么會這樣?

此錯誤發生在:

template<typename _Tp> inline
_Tp Rect_<_Tp>::area() const
{
    return width * height; //Thread 6:EXC_BAD_ACCESS(code 1, dress=0x8)
}
//this method is in types.hp in latest opencv framework

我的彩色物體識別代碼如下:

#pragma mark - Protocol CvVideoCameraDelegate
#ifdef __cplusplus
- (void)processImage:(cv::Mat &)image{
   Mat imageCopy,imageCopy2;
   cvtColor(image, imageCopy, COLOR_BGRA2BGR);

   cvtColor(imageCopy, imageCopy2, COLOR_BGR2HSV);
   //smooth the image
   GaussianBlur(imageCopy2, imageCopy, cv::Size(5,5),0, 0);

   cv::inRange(imageCopy, cv::Scalar(0,0,0,0), cv::Scalar(180,255,30,0),     
   imageCopy2);    

/*****************************find the contour of the detected area abd draw  it***********************************/
//2-D point to store countour
std::vector< std::vector<cv::Point>> contour1;
//do opening on the binary thresholded image

   int erosionSize = 3;
   Mat erodeElement =    
   getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(2*erosionSize+1,2* erosionSize+1), cv::Point(erosionSize,erosionSize));
   erode(imageCopy2, imageCopy2, erodeElement);
   dilate(imageCopy2, imageCopy2, erodeElement);

   //Acual line to find the contour
   cv::findContours(imageCopy2, contour1, RETR_EXTERNAL, CHAIN_APPROX_NONE);

   //set the color used to draw the conotour
   Scalar color1 = Scalar(50,50,50);

  //loop the contour to draw the contour
  for(int i=0; i< contour1.size(); i++){
     drawContours(image, contour1, i, color1);
  }
  /******END*****/

/****************************find the contour of the detected area abd draw  it***********************************/
/****************************Appproximate the contour to polygon && get bounded Rectangle and Circle*************/
std::vector<std::vector<cv::Point>> contours_poly(contour1.size());
std::vector<cv::Rect> boundedRect(contour1.size());
std::vector<cv::Point2f> circleCenter(contour1.size());
std::vector<float> circleRadius(contour1.size());

for (int i=0; i< contour1.size(); i++){
    approxPolyDP(Mat(contour1[i]), contours_poly[i], 3, true);
    boundedRect[i] = boundingRect(Mat(contours_poly[i]));
    minEnclosingCircle((Mat)contours_poly[i], circleCenter[i], circleRadius[i]);

}
/******END*******/
/*****************************draw the rectangle for detected area ***********************************************/
Scalar recColor = Scalar(121,200,60);
Scalar fontColor = Scalar(0,0,225);
//find the largest contour
int largestContourIndex=0;
for (int i=0; i<contour1.size(); i++){
    if(boundedRect[i].area()> boundedRect[largestContourIndex].area())
        largestContourIndex=i;
}

int j=largestContourIndex;
if(boundedRect[j].area()>40){
    rectangle(image, boundedRect[j].tl(), boundedRect[j].br(), recColor);
    //show text at tl corner
    cv::Point fontPoint = boundedRect[j].tl();
    putText(image, "Black", fontPoint, FONT_HERSHEY_COMPLEX, 3, fontColor);    
    }


//    cvtColor(imageCopy, image, COLOR_HLS2BGR);
}
#endif

最終弄清楚為什么:正如@SolaWing所說,存在一些空指針。 對於將來的查看者,只想使其更加清晰即可:

問題在於以下代碼:

if(boundedRect[j].area()>40){
rectangle(image, boundedRect[j].tl(), boundedRect[j].br(), recColor);
//show text at tl corner
cv::Point fontPoint = boundedRect[j].tl();
putText(image, "Black", fontPoint, FONT_HERSHEY_COMPLEX, 3, fontColor);    
}

對於此代碼塊,它已經假定始終存在檢測到的區域,但是實際上,當電話攝像頭前面沒有目標區域時, contour.size()為零,對於std::vector<cv::Rect> boundedRect(contour1.size()); boundedRect是空指針,那么當我使用if(boundedRect[j].area()>40){} ,會出現問題,它使用空指針的第一個指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM