C++ Opencv断言失败
我试图从图像中只提取具有特定大小的轮廓 我是这样处理的C++ Opencv断言失败,c++,opencv,image-processing,C++,Opencv,Image Processing,我试图从图像中只提取具有特定大小的轮廓 我是这样处理的 int offsetX ; int offsetY ; //here: read original image as 8UC3 cv::Mat original = cv::imread("0.png"); Mat imgx=original.clone(); cv::imshow("original", original); cvtColor(imgx,imgx,CV_BGR2GRAY); Mat
int offsetX ;
int offsetY ;
//here: read original image as 8UC3
cv::Mat original = cv::imread("0.png");
Mat imgx=original.clone();
cv::imshow("original", original);
cvtColor(imgx,imgx,CV_BGR2GRAY);
Mat thresh;
vector<Vec4i> hierarchy;
RNG rng(12345);
vector < vector<Point> > contours;
adaptiveThreshold(imgx, thresh, 255, 1, 1, 31, 2);
findContours(thresh, contours, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
Mat drawing = Mat::zeros(thresh.size(), CV_8UC3);
cout << "drawing "<<drawing.type()<<endl;
cv::Mat image = cv::Mat(original.rows, original.cols, original.type());
image.setTo(cv::Scalar::all(255));
for (size_t i = 0; i < contours.size(); i++)
{
vector < Point > cnt = contours[i];
if (contourArea(cnt) > 0)
{
Rect rec = boundingRect(cnt);
if ((rec.height > 20 ) &&(3.5*rec.height>rec.width)&& (rec.width>15)/*&& (rec.width<40)*/)
{
cout<<rec.x<<" "<<rec.y<<endl;
offsetX=rec.x;
offsetY=rec.y;
Mat roi = original(rec);
int width = roi.cols;
int height = roi.rows;
cout <<"h= "<<height<<" w= "<<width<<endl;
cv::Rect characterLocation;
if(height>35)
characterLocation = cv::Rect(offsetX+3, offsetY, width, height);
else
characterLocation = cv::Rect(offsetX, offsetY, width, height);
original(characterLocation).copyTo(image(characterLocation));
imshow("jihedddd",roi);
imwrite("xxxxxx.png",roi);
Mat stagedImage;
Mat img;
Scalar color = Scalar(255, 255, 255);
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
imshow("Contours", drawing);
waitKey();
GaussianBlur(stagedImage, img, Size(5, 5), 2, 2);
medianBlur(img, stagedImage, 3);
Mat copy = original.clone();
rectangle(copy, Point(rec.x, rec.y),
Point(rec.x + rec.width, rec.y + rec.height),
CV_RGB(0x00,0x00,0xff), 3);
cv::imshow("char copied", image);
}
}
}
medianBlur(image,image,3);
cv::imshow("char copied", image);
cv::imwrite("characterC_result.tiff ", image);
cv::waitKey();
intoffsetx;
int-offsetY;
//此处:将原始图像读取为8UC3
cv::Mat original=cv::imread(“0.png”);
Mat imgx=original.clone();
简历::imshow(“原件”,原件);
CVT颜色(imgx、imgx、CV_bgr2灰色);
垫式脱粒机;
向量层次;
RNG RNG(12345);
矢量<矢量>等高线;
自适应阈值(imgx,thresh,255,1,1,31,2);
findContours(阈值、等高线、等高线、外部等高线、链近似线和简单线);
垫图纸=垫::零(thresh.size(),CV_8UC3);
cout 15)/*&(rec.width您必须小心:
characterLocation = cv::Rect(offsetX+3, offsetY, width, height);
如果width是imagewidth,则此处超出范围。您必须从width中减去x,或者将矩形裁剪到图像边框:
// get the Rect for the original image:
cv::Rect borders(Point(0,0), image.size());
// crop to the legal size:
characterLocation = cv::Rect(offsetX+3, offsetY, width, height) & borders;
你有没有仔细检查过错误的地方?我想这是错误的原处(characterLocation)。copyTo(image(characterLocation));但我仍然不知道它的原因。你必须调试代码,以找出导致此问题的确切代码行。没有这些信息,我们无法提供帮助。