C++向量下标超出范围,出现opencv错误

pnwntuvh  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(236)

有什么想法我可能在哪里出错了。PS:编码和StackOverFlow的新知识。

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/imgproc.hpp>

//Declare the image variables
cv::Mat img, imgGray, imgBlur, imgCanny, imgDil;

void GetContours(cv::Mat dilatedImg, cv::Mat originalImg);

int main(int argc, char** argv)
{
   std::string path="E://Trial//Resources//Resources//shapes.png";
   img= cv::imread(path);
 

   //pre=processing
   cv::cvtColor(img,imgGray,cv::COLOR_BGR2GRAY);
   cv::GaussianBlur(imgGray, imgBlur,cv::Size(3,3),3,0);
   cv::Canny(imgBlur,imgCanny,25,75);
   cv::Mat kernel= cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3)) ;
   cv::dilate(imgCanny,imgDil,kernel);

   //Processing
   GetContours(imgDil, img);
   
   //Display contours
   cv::imshow("Image",img);
   cv::waitKey(0);

   return 0;
}

void GetContours(cv::Mat dilatedImg, cv::Mat originalImg)
{
   std::vector<std::vector<cv::Point>> contours;
   std::vector<cv::Vec4i> hierarchy;
   std::vector<std::vector<cv::Point>> conPoly(contours.size());
   double area=0;

   //finds the contours in the shapes
   cv::findContours(dilatedImg, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
   
   for(int i=0; i<contours.size(); i++)
   {
      area = cv::contourArea(contours[i]);
      std::cout<<area<<std::endl;
      
      if(area>1000)
      {
         //Draw contours around shapes
         cv::drawContours(originalImg,contours, i,cv::Scalar(255,0,255),2);
         
         // create a bounding box around the shapes
         cv::approxPolyDP(cv::Mat(contours[i]), conPoly[i], 3, true);
        
         //draw contours using the contour points
         cv::drawContours(originalImg,conPoly, i,cv::Scalar(255,255,0),2);         
      }
   }
}

ApproxPollyDP是我认为代码失败的地方。我得到了一个Assert失败的错误,向量超出范围。我认为我犯了一些愚蠢的错误,但我一直无法调试这个问题。

brtdzjyr

brtdzjyr1#

向量conPoly声明如下

std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
std::vector<std::vector<cv::Point>> conPoly(contours.size());

是空向量,因为最初contours.size()等于tp 0,因为向量contours又被声明为空。
所以使用下标运算符和向量

cv::approxPolyDP(cv::Mat(contours[i]), conPoly[i], 3, true);

调用未定义的行为。

pxy2qtax

pxy2qtax2#

这是可行的:

std::vector<std::vector<cv::Point>> contours;
   std::vector<cv::Vec4i> hierarchy;
   double area=0;

   //finds the contours in the shapes
   cv::findContours(dilatedImg, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
   
   std::vector<std::vector<cv::Point>> conPoly(contours.size());

相关问题