有什么想法我可能在哪里出错了。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失败的错误,向量超出范围。我认为我犯了一些愚蠢的错误,但我一直无法调试这个问题。
2条答案
按热度按时间brtdzjyr1#
向量
conPoly
声明如下是空向量,因为最初
contours.size()
等于tp0
,因为向量contours
又被声明为空。所以使用下标运算符和向量
调用未定义的行为。
pxy2qtax2#
这是可行的: