我想在图像中的水印周围画一个盒子.我提取了水印并找到了轮廓.但是,该轮廓并未在水印周围绘制.轮廓绘制在我的完整图像上.请帮助我使用正确的代码. 轮廓坐标的输出为: [array([[[ 0, 0]], [[ 0, 634]], [[450, 634]], [[450, 0]]], dtype=int32)] 输出图像是: 我的代码片段如下: img = cv2.imread('Watermark/w3.png') gr = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) bg = gr.copy() closing = cv2.morphologyEx(bg, cv2.MORPH_CLOSE, kernel) #dilation followed by erosion #plt.imshow(cv2.subtract(img,opening)) plt.imshow(
以下是关于 contour 的编程技术问答
我想在二进制图像中使用findContours,但是回调函数会导致错误: 指定为rtlfreeheap 的无效地址 返回时. 当我想使用clear()释放vector >值时,它会导致相同的异常,并且代码在free.c in the Line中崩溃: if (retval == 0) errno = _get_errno_from_oserr(GetLastError()); 例如: void onChangeContourMode(int, void *) { Mat m_frB = imread("3.jpg", 0); vector> contours vector hierarchy; findContours(m_frB, contours, hierarchy, g_contour_mode, CV_CHAIN_APPROX_SIMPLE);
我的程序的目标是从摄像机中识别最大的轮廓并用红线绘制. 我发现,当检测到最大的轮廓(aka largest_contours)时,轮廓的轮廓线将闪烁,有时会中断围绕它绘制红线的功能(因为轮廓线不再连接,因此在图像中不再检测到轮廓). 我的问题是: 这个问题发生的原因是什么? 如何避免(或我们可以避免)此问题发生? 有什么建议改善我的轮廓检测程序? 预先感谢. PS: For the codes, pics and more info, click 在这里. 解决方案 findContours OpenCV的API修改了它用于查找轮廓的图像.您可以尝试以下内容. Mat displayContours = Mat::zeros(image.rows,image.cols,CV_8UC1); for(int i = 1;i
我现在正在使用的程序几乎完成了完成的程序,但我对结果并不满意.通过使用Canny算法,我设法清楚了该对象的轮廓,但是该程序有一些问题可以识别轮廓并用红线绘制轮廓.程序: void setwindowSettings(){ namedWindow("Contours", CV_WINDOW_AUTOSIZE); createTrackbar("LowerC", "Contours", &lowerC, 255, NULL); createTrackbar("UpperC", "Contours", &upperC, 255, NULL); } void wait(void) { long t=30000000; while(t--); } int main(void) { VideoCapture cap(0); // open the default camera if(!cap.isOpened()) // check if we
我想为3D数据绘制轮廓图. 我在x,y,z方向上有一支力量,我想绘制该轮廓3的 fx = 21x21x21的尺寸对于fy和fz 相同 我发现力= f*vector(x,y,z) 然后 Fx(x,y,z) = force(1) Fy(x,y,z) = force(2) Fz(x,y,z) = force(3) 我做了以下操作,但它不与我合作?为什么以及如何绘制 FS = sqrt(Fx.^2 + Fy.^2 + Fz.^2); x = -10:1:10; [X,Y] = meshgrid(x); for i=1:length(FS) for j = 1:length(FS) for k=1:length(FS) contour3(X,Y,FS(i,j,k),10) hold on end end end 这是我遇到的错误 使用Contour3(第129行)错误 当z是向量时,x和
我需要控制MATLAB中使用scatterhist命令产生的图形中标记的透明度. 以下帖子有助于处理直方图的颜色: 如何修改标记的透明度? 如何在标记顶部添加轮廓图? 解决方案 tl; dr : 在MATLAB R2019A中, scatterhist() 可以做轮廓" https://stackoverflow.com/questions/50466320/controlling-scatterhist-bar-colors/50466995#comment103562645_50466995"> possible 请参见下面的第三个选项,使用 % MATLAB R2019a n = 250; % Number of Points X = exprnd(3,n,1); Y = gamrnd(9,1/3,n,1); 使用 您可以使用MarkerAlpha属性调整标记透明度. T = table(X,Y); figure s
我有一个XLD轮廓,我需要从世界平面转换为图像平面..但是我只能找到affine_trans_contour_xld,它接受2D垫子,而不是3D垫子.从世界平面到图像平面? 基本上我需要的是contour_to_world_plane_xld 的倒数 编辑:我认为解决方案是找到XY平面的2D垫子,但找不到该方法. 解决方案 我这样解决了: *get the points of a 100 mm square on my XY plane. Since the XLD is in 1px=1mm affine_trans_point_3d(Mat3D, 0, 0, 0, X, Y, Z) project_3d_point(X, Y, Z, CamParam, Xp1, Yp1) affine_trans_point_3d(Mat3D, 0, 0.1, 0, X, Y, Z) project_3d_point(X, Y, Z, CamParam, Xp2, Yp2)
我正在尝试通过录制视频中的python中的opencv跟踪对象.我想在每个可见对象出现时给出一个唯一的对象NR.例如,一个对象进入屏幕并获取NR1,然后第二个对象连接第一个并获得NR2,然后第一个对象离开屏幕,但第二个对象仍然可见,并且仍然获得对象NR2而不是1(是唯一的对象).我找不到有关如何在线执行此操作的任何信息.感谢任何帮助(包括代码). 我到目前为止写的代码用于获取轮廓和绘制对象编号: cap = cv2.VideoCapture("video.mov") while True: flag, frame = cap.read() cv2.drawContours(frame, contours, -1, (255,0,0) ,1) for i in range(len(contours)): cnt = contours[i] cnt_nr = i+1 x,y,w,h = cv2.boundin
我正在与python一起使用OpenCV从图像中提取轮廓.现在,我需要将这些轮廓路径(列表)导出为SVG路径.我该如何实现? 代码: ret,thresh = cv2.threshold(imgray,27,25,0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_TC89_L1) print(type(contours)) #type list 解决方案 问题已解决如下: c = max(contours, key=cv2.contourArea) #max contour f = open('path.svg', 'w+') f.write('') f.write('
给定一组(x, y, z)坐标,我将如何创建轮廓图? 很高兴知道如何在 for https://github.com/jasondavies/conrec.js.js 本质上,我想使用d3.js复制此轮廓图: http://beaugunderson.com/routes/routes/ 解决方案 使用conrec.js看起来这很容易.如果您以所拥有的形式传递数据,则可以通过调用.contourList()在结果中获取路径列表.您应该能够通过不修改d3 .data()呼叫.您要做的就是提供一个路径生成器,该路径发生器将数据中的坐标映射到筛选坐标. . 其他解决方案 plotly.js基于d3.js,并提供了轮廓图.例如: plotly.js:如何避免重叠的轮廓线? 如何将plotly.js应用于现有SVG组作为目标,而不是将其应用于目标 元素? 还有一个用于D3.js的轮廓插件(我尚未使用): 和一个例子: http://bl.
我正在尝试找到(但不绘制!)用于某些数据的轮廓线: from pprint import pprint import matplotlib.pyplot z = [[0.350087, 0.0590954, 0.002165], [0.144522, 0.885409, 0.378515], [0.027956, 0.777996, 0.602663], [0.138367, 0.182499, 0.460879], [0.357434, 0.297271, 0.587715]] cn = matplotlib.pyplot.contour(z) 我知道cn包含我想要的轮廓线,但我似乎无法得到 给他们.我尝试了几件事: print dir(cn) pprint(cn.collections[0]) print dir(cn.collections[0]) pprint(cn.collections[0].figure) print
我正在制作一个OCR,我正在使用轮廓检测,我提取了单词并绘制了边界框,但问题是当我裁剪单个单词时,它们的顺序不是分类的.我尝试在此链接对轮廓进行排序,但它们在对象上最有效,但在我的情况下,我想确切地进行订单.有时,排序不是最好的解决方案,它会改变单词模式,因为不同的单词在相同的行中具有不同的边界框的大小,而" x"和" y"的值随之变化.现在,在同一行中,具有较大边界框的单词被认为是一个类别,而小的单词被视为其他类别,并且它们以相同的方式进行分类.这是要排序的代码. sorted_ctrs=sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0] + cv2.boundingRect(ctr)[1] * im.shape[1] ) 提取的有界盒子的图像 还有其他方法可以安排我的话以使其有意义吗? 解决方案 您应该首先分开不同的线条.完成此操作后,您可以简单地处理从左到右的轮廓(从x = 0到x =
如何按轮廓区域的大小对轮廓进行排序?我该如何获得最大/最小的? 解决方案 您可以使用 std::sort 使用自定义比较功能对象 // comparison function object bool compareContourAreas ( std::vector contour1, std::vector contour2 ) { double i = fabs( contourArea(cv::Mat(contour1)) ); double j = fabs( contourArea(cv::Mat(contour2)) ); return ( i > contours; std::vector hierarchy; cv::
如您在图像中所看到的,我想比较这些轮廓. 当将这些轮廓相互比较时,我需要我的openCV程序才能返回true. 他们都看起来一样,但您可以看到它们并不完全相同. 您在这里看到的结果是我从函数FindContours返回的内容. 所以我正在寻找适合这些轮廓的合适方法. 任何帮助都会很棒. 非常感谢您. 解决方案 Take a look at cvMatchShapes() (以前称为cvMatchContours()). 其他解决方案 要使用matchShapes()函数,您应该将vector,vector作为参数传递. 因此,不是像您一样的轮廓容器,而是从中进行的特定轮廓.您要比较的形状应该是一个轮廓.
我有一个简单的图像,其中包含一些形状:一些矩形和一些椭圆形,总数为4或5.形状可以旋转,缩放和重叠.有一个样本输入: 我的任务是检测所有这些数字并准备一些有关它们的信息:大小,位置,旋转等.我认为,核心问题是形状可以彼此重叠的事实.我试图搜索有关此类问题的一些信息,发现OpenCV库可能非常有用. OpenCV具有检测轮廓,然后尝试将椭圆形或矩形适合这些轮廓.问题是当形状被过多时,轮廓混合了. 我考虑遵循算法:检测所有特征点:并将白点放在它们上.我得到了类似的东西,每个数字都分为单独的部分: 然后,我可以尝试使用一些信息来链接这些零件,例如复杂性值(我将曲线colve actoldp符合到轮廓以及读取其有多少零件).但这开始非常困难.另一个想法是尝试将轮廓链接并试图适合它们的所有排列.最好的汇编将是输出. 有什么想法如何创建简单但优雅的解决方案? 解决方案 模糊图像有助于找到代码中所示的交叉点 #include "opencv2/imgproc.hpp"
我想输出一只蓝色的手,但要获得不正确的输出.我包括输入图片,不正确的输出图片和下面的代码. 我认为下面的代码不会填充整个图像,因为图像尚未在正确的边界处关闭. 如何关闭形状并正确填充蓝色? #include #include #include #include #include #include using namespace cv; using namespace std; void drawStuff(); void showInputWindow(); void showCannyWindow(); void showContourWindow(); int thresh = 40; int max_thresh = 120; M