Я пытался использовать findContour(), чтобы получить контуры из следующих картины OpenCV2 findContours(), контуры размер не равен размеру иерархии
Этот код выглядит так:
Mat mat = imread("123.jpg");
cv::imshow("123.jpg",mat);
Mat hsv;
cvtColor(mat,hsv,COLOR_BGR2HSV);
Mat dst;
inRange(hsv,Scalar(0,0,49),Scalar(47,165,111),dst);
cout<<"dst channels:"<<dst.channels()<<endl;
int c0=0,c255=0,other=0;
for(int i=0;i<dst.rows;i++){
for(int j=0;j<dst.cols;j++){
int v = dst.at<uchar>(i,j);
if(v == 0){
c0++;
}else if(v == 255){
c255++;
}else{
other++;
}
}
}
cout<<"0 count:"<<c0<<",255 count:"<<c255<<",other value count:"<<other<<endl;
cv::erode(dst,dst,cv::Mat(),cv::Point(1,1),6);
cv::dilate(dst,dst,cv::Mat(),cv::Point(1,1),6);
cv::medianBlur(dst,dst,15);
cv::imshow("inRange",dst);
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat temp;
dst.copyTo(temp);
findContours(temp,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
cout<<"contours size:"<<contours.size()<<endl;
cout<<"hierarchy size:"<<hierarchy.size()<<endl;
for (int index = 0; index >= 0; index = hierarchy[index][0]) {
cout<<"hierarchy at:"<<index<<","<<hierarchy[index]<<endl;
cv::drawContours(mat,contours,index,Scalar(120,255,0));
}
cv::imshow("contours",mat);
waitKey(0);
return 0;
конечного контура изображения, как это:
Журнал отпечатан в окне консоли, как это:
Я не знаю, почему размер контура меньше, чем размер иерархии. на самом деле должно быть три формы «ВНЕШНИЙ». Кажется, пропущена одна форма в контурах вывода. этот вопрос затормозил меня в течение дня, и теперь я буду сумасшедшим ... кто-нибудь знает, почему в контурах всего два элемента: я сделал что-то не так?
AFAIK, когда вы назвали findContours() с параметром иерархии CV_RETR_EXTERNAL бессмысленна – sturkmen