Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenCV C+中绘制一条穿过水滴的曲线+;_C++_Opencv_Image Processing_Contour - Fatal编程技术网

C++ 在OpenCV C+中绘制一条穿过水滴的曲线+;

C++ 在OpenCV C+中绘制一条穿过水滴的曲线+;,c++,opencv,image-processing,contour,C++,Opencv,Image Processing,Contour,我试图划出一条穿过给定斑点的线。下面是一个给定的示例 我想要一条水平方向穿过多个斑点的曲线,如下所示 举个例子: import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) (_, contours, _) = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # bi

我试图划出一条穿过给定斑点的线。下面是一个给定的示例

我想要一条水平方向穿过多个斑点的曲线,如下所示

举个例子:

import cv2
import numpy as np

img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
(_, contours, _) = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# biggest area
target = max(contours, key=lambda x: cv2.contourArea(x))
cv2.drawContours(img, [target], -1, [0, 0, 255], -1) # debug
# just example of fitting
x = target[:, :, 0].flatten()
y = target[:, :, 1].flatten()
poly = np.poly1d(np.polyfit(x, y, 5))
for _x in range(min(x), max(x), 5): # too lazy for line/curve :)
    cv2.circle(img, (_x, int(poly(_x))), 3, [0, 255, 0])

cv2.imshow('result', img)
cv2.waitKey(0)

只是为了好玩,我运用了TMTOWTDI的Perl哲学(“有多种方法可以做到)”,将轮廓的所有白点提取到一个名为
points.dat
的文件中,并将其输入
gnuplot
以拟合曲线,这为我提供了一个最佳拟合线的公式:

y=3.10869110524588e-07*x*x*x -0.000972406154863963*x*x + 0.861790477479291*x + 307.220397010312
然后我用awkImageMagick在原始轮廓上用红色绘制

#!/bin/bash
convert contours.jpg -colorspace gray -threshold 50% txt: | awk -F: '/white/{print $1}' | tr ',' ' ' > points.dat
{ echo 'f(x) = a*x**3 + b*x**2 + c*x + d'; \
  echo 'fit f(x) "points.dat" via a, b, c, d'; \
  echo 'print a,"*u^3 + ",b,"*u^2 + ",c,"*u + ",d'; \
} | gnuplot 2>&1 | tail -1    

awk 'BEGIN{
     for(x=0;x<1504;x++){
        y=3.10869110524588e-07*x*x*x -0.000972406154863963*x*x + 0.861790477479291*x + 307.220397010312
        y=int(y)
        print "point ",x,y
     }
     }' /dev/null > p.mvg

convert contours.jpg -draw @p.mvg z.png
p.mvg
的开头如下所示:

769 453
770 453
771 453
772 453
773 453
769 454
765 455
766 455
767 455
768 455
...
...
fill red
point  0 307
point  1 308
point  2 308
point  3 309
point  4 310
point  5 311
point  6 312
point  7 313
point  8 314
...
...

你的问题很不清楚。绿线是什么?紫色的线条?你想要直线还是曲线?你的密码在哪里?实际问题是什么?@MarkSetchell我编辑问题时,有更多信息仍然不清楚,请使用一个简化的示例,在图像中绘制您想要的内容。确保你知道蓝色和紫色的区别。你的描述似乎把它们混在一起了。轮廓没有轮廓。它们是轮廓。此外,您的图像不显示轮廓。它显示了一些博客。现在我做了简单的你能写C++吗?我还想把水平范围内的斑点连接起来,马克斯,我很抱歉,但是我只有Python + C++,它们没有NUMPY,所以你需要搜索任何的LIBS来进行数学运算。嘿,没问题。谢谢你的努力。你能告诉我,我怎样才能把这条线和水平方向上的其他水滴连接起来吗?正如您看到的给定图像(蓝色的延伸线)。最简单的方法是——获取所有轮廓(连接它们的点),但看起来可能不是很好。稍微难一点/更好一点的方法-计算最大面积(如我所做的),而不是通过到直线的平均距离过滤其他轮廓,然后通过所有剩余轮廓重新计算曲线。你所说的“到直线的平均距离”是什么意思?我可以用哪一点来进行距离计算?嘿,谢谢你的实现,但是请你告诉我,我如何在C++或OpenCV中实现它?你最终想要达到的目标是什么?你想要曲线的公式吗?或者你想要一个有一条像素宽的线穿过轮廓的图像?作为下一步处理,你将如何处理答案?是的,我想要一条穿过轮廓线的单像素宽的线,我必须将穿过轮廓线的线信息提供给机器。