gpt4 book ai didi

opencv - 沿其整个长度的轮廓宽度测量

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:44 25 4
gpt4 key购买 nike

我正在做一个测量轮廓宽度的项目。我已经从图像中检测到轮廓(见图 1)。下一步是测量 coutour 沿其长度的宽度(如图 2 所示)。请给我任何想法。非常感谢您的帮助!

谢谢!

masked contour image

img1

required width measurement from contour, green lines indicate width

img2

我有一个计算轮廓的函数,然后下一步是测量所选轮廓沿其长度的宽度。下面是示例代码。

...
// image is read, thresholded and canny edges are detected. That image is input to a function that computes contours from the image.
///Below is the code in the contour function

cv::Mat src_contour= inputImage.clone(); // input image is cloned for contour detection
cv::Mat maskContour = cv::Mat::zeros(src_contour.size(), CV_8UC3);
std::vector<std::vector<cv::Point> > contours; // stores contours points. Each contour is stored in a vector and there are number of vectors for number of contours
cv::RNG rng(12345); // random number used for random colours of contours
cv::findContours( src_contour, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

int nc=contours.size();// nc: total number of countours detected

std::vector<int>areas(nc); // stores area of each contour in a vector
std::vector<double>arclens(nc); // stores arc length (perimeter) of each contour in a vector
std::vector<double>aspect_ratio(nc); // Apect ratio of the contour , width/height
std::vector<cv::Rect> r(nc) ; // Vector of rectangles,

int min_area=15000 ; // Minimum area for contour selection
int min_arclen=1000; // Minimum Arc length used for filtering contours
double min_aspRatio= 2; // Minimum Aspect ratio used for filtering , deafutl 2.0
double max_aspRatio=4; // Maximum aspect rario used for filtering , default 4.0

for (int i=0; i< nc; i++) // Loop iterates through contours , calculates properties and draws selected contours
{
areas[i]=cv::contourArea(contours[i],false); // Area of each contour is stored in a vector, false: any contour, true: closed contour
arclens[i]=cv::arcLength(contours[i],false); // Arclength of each contour is stored in a vector
r[i]=cv::boundingRect(contours[i]); // Stores bounding rect for each contour in a vector r
aspect_ratio[i]=float(r[i].width)/r[i].height; // Aspect ratio of each contour is stored in a vector

if ((areas[i] > min_area) && (arclens[i] > min_arclen) && (aspect_ratio[i] > min_aspRatio && aspect_ratio[i] < max_aspRatio))
{
cv::drawContours(maskContour, contours, i, cv::Scalar(255,255,255), CV_FILLED); // creates mask from contours (filterd by criteria), fills them
}
}

// maskContour image is the image of selected contours filled , I have access to all the points on the contour. From the selected contours
// need to compute width of contours

.....
// Now contour width measurement is required

最佳答案

我认为 distanceTransform(OpenCV 的)和 skeleton(也许是你自己)会起作用。

主要思想:

  1. 阈值你的灰度图像,然后做distanceTransform得到dist-map
  2. 找到dist-map的骨架,宽度是骨架值的两倍。

距离图如下。

enter image description here

然后您尝试找到骨架将 dist 值加倍以获得宽度。


用 C++ 代码更新:

int main() {
// read as gray and threshold
Mat gray, threshed, dist;
gray = imread("img01.png", 0);
threshold(gray, threshed, 100, 255, THRESH_BINARY);
imshow("threshed", threshed);

//distanceTransform
distanceTransform(threshed, dist, DIST_L2, 3);

// normalize for display
Mat dst;
normalize(dist, dst, 255, 0, NORM_MINMAX,CV_8UC1);
imshow("dst", dst);
waitKey();

return 0;
}

关于opencv - 沿其整个长度的轮廓宽度测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com