gpt4 book ai didi

image-processing - 如何使用 javacv/opencv 识别黑色多边形上的点?

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:11 26 4
gpt4 key购买 nike

我尝试识别这个黑色多边形周围的轮廓,我需要访问这些点,但它对我不起作用。这是输入图像 enter image description here

但是当我尝试执行以下代码时,它没有给出预期的结果,这意味着它应该。

        CanvasFrame cnvs=new CanvasFrame("Polygon");
cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);

CvMemStorage storage=CvMemStorage.create();
CvSeq squares = new CvContour();
squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage);
String path="project/Test/img/black.png";
IplImage src = cvLoadImage(path);
IplImage gry=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
cvCvtColor(src, gry, CV_BGR2GRAY);
cvThreshold(gry, gry, 230, 255, CV_THRESH_BINARY_INV);
cnvs.showImage(gry);
cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
CvSeq ss=null;
CvSeq tmp=null;
int ii=0;
for (ss=squares; ss!=null; ss=ss.h_next()) {
tmp=cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0);
System.out.println("index "+ii+" points "+tmp.total()+" area "+cvContourArea(ss, CV_WHOLE_SEQ, 0));
cvDrawContours(src, ss, CvScalar.RED, CV_RGB(248, 18, 18), 1, -1, 8);
//drawPoly(src, tmp);
}
IplConvKernel mat=cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT, null);
cvDilate(src, src, mat, CV_C);
cvErode(src, src, mat, CV_C);
cnvs.showImage(src);
saveImage("nw.png", src);

但是当我检查输出时,它只给出了

索引0点8区20179.0

这意味着它只识别多边形的 8 个点,但应该是 12 个点。请有人解释这段代码的问题。

这显示输出图像

enter image description here

最佳答案

cvApproxPoly() 函数使用 Ramer–Douglas–Peucker曲线近似算法。该算法的目的是找到一条具有较少点的相似曲线。该算法本身将两个参数作为输入:

  • 点(顶点)列表,
  • 近似精度。

简而言之,近似精度值越大,近似曲线中被遗漏的点的可能性越大(请引用维基百科article,特别是this动画)。在您的函数调用中:

cvApproxPoly(ss, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0);

第五个参数是近似精度。如果您不想减少顶点数,则该值应该很小(对于此示例,大约 1 的值正好给出 12 个顶点,因此没有近似值)。

关于image-processing - 如何使用 javacv/opencv 识别黑色多边形上的点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973401/

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