标签: opencv-contour

想要找到轮廓 - > ValueError:没有足够的值来解压缩(预期3,得到2),这就出现了

我的简单python代码是这样的

import cv2

img=cv2.imread('Materials/shapes.png')

blur=cv2.GaussianBlur(img,(3,3),0)
gray=cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY)
returns,thresh=cv2.threshold(gray,80,255,cv2.THRESH_BINARY)

ret,contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:

    area=cv2.contourArea(cnt) #contour area

    if (area>1220):
        cv2.drawContours(img,[cnt],-1,(0,255,0),2)
        cv2.imshow('RGB',img)
        cv2.waitKey(1000)
        print(len(cnt))

import numpy as np

contours=np.array(contours)

print(contours)
Run Code Online (Sandbox Code Playgroud)

这很好.但最近没有我做任何改变.这是扔给我的

RET,轮廓,层次结构= cv2.findContours(THRESH,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

ValueError:没有足够的值来解压缩(预期3,得到2)

帮帮我们

谢谢.

python python-3.x opencv-contour

28
推荐指数
2
解决办法
2万
查看次数

处理OpenCV 2.4中的轮廓和边界矩形 - python 2.7

我正在使用openCv和python,我正在处理结构分析和形状描述符.我找到了这个博客:http://opencvpython.blogspot.it/2012/06/contours-2-brotherhood.html 这是非常有帮助的,我尝试用黑白图像绘制一个边界矩形,它的工作原理.但是现在从我提取的图像,例如,黄色和我想要绘制一个边界矩形.问题是黑白图像不均匀,有一些噪音,而且代码不能识别整个形状.

原始图像

黑白图像

最终形象

这是代码:

import numpy as np
import cv2

im = cv2.imread('shot.bmp')
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
COLOR_MIN = np.array([20, 80, 80],np.uint8)
COLOR_MAX = np.array([40, 255, 255],np.uint8)
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX)
imgray = frame_threshed
ret,thresh = cv2.threshold(frame_threshed,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("Show",im)
cv2.waitKey()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

opencv image-processing python-2.7 opencv-contour

19
推荐指数
1
解决办法
5万
查看次数

在Opencv Python中获取轮廓区域?

我使用自适应阈值技术来创建如下图片:

在此输入图像描述

我使用的代码是:

image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)
Run Code Online (Sandbox Code Playgroud)

然后,我使用此代码来获取轮廓:

cnt = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
Run Code Online (Sandbox Code Playgroud)

我的目标是使用外部轮廓内的所有像素生成蒙版,因此我想将对象内的所有像素填充为白色.我怎样才能做到这一点?

我已经尝试了下面的代码来创建一个掩码,但是在应用自适应阈值后,生成的掩码似乎与图像没有什么不同

mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing opencv-contour

16
推荐指数
1
解决办法
1万
查看次数

如何使用 python opencv 将重叠的卡片彼此分开?

我正在尝试检测扑克牌并使用 python opencv 将它们转换为鸟瞰卡片。我的代码适用于简单的情况,但我并没有停留在简单的情况下,而是想尝试更复杂的情况。我在为卡片找到正确的轮廓时遇到问题。这是我试图检测卡片并绘制轮廓的附加图像:

在此处输入图片说明

我的代码:

path1 = "F:\\ComputerVisionPrograms\\images\\cards4.jpeg"
g = cv2.imread(path1,0)
img = cv2.imread(path1)

edge = cv2.Canny(g,50,200)

p,c,h = cv2.findContours(edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rect = []
for i in c:
    p = cv2.arcLength(i, True)
    ap = cv2.approxPolyDP(i, 0.02 * p, True)
    if len(ap)==4:
        rect.append(i)
cv2.drawContours(img,rect, -1, (0, 255, 0), 3)

plt.imshow(img)
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

这不是我想要的,我只想选择矩形卡片,但由于它们相互遮挡,我没有得到我所期望的。我相信我需要应用形态学技巧或其他操作来将它们分开或使边缘更加突出或可能是其他东西。如果您能分享您解决此问题的方法,将不胜感激。

其他研究员要求的更多示例:

在此处输入图片说明

在此处输入图片说明

python opencv contour opencv-contour image-morphology

14
推荐指数
2
解决办法
1596
查看次数

cv :: findContours返回的轮廓是否具有一致的方向?

我正在使用OpenCV的cv::findContours函数来提取二进制图像中的轮廓,特别是,我正在提取轮廓的层次结构(使用CV_RETR_CCOMP标志).在我对这些轮廓进行进一步处理的某些时刻,我需要依赖这些轮廓一致顶点方向(即逆时针方向与顺时针方向).

当然我可以使用轮廓区域的符号(由计算方法cv::contourArea(..., true))自己确定方向,但我想知道这是否是必要的(除此之外,它甚至不适用于面积为0的轮廓,即薄(源图像中的线条)或者如果cv::findContours已经保证生成的轮廓的一致方向.我确实检查了一些生成的轮廓,cv::contourArea确实似乎返回外轮廓的负值和内轮廓的正值.但是,我在OpenCV文档中找不到任何实际的保证.

那么,它是否特别保证返回的轮廓cv::findContours始终具有一致的方向?这记录在哪里?或者它是否因版本而异(我的情况是2.4.5)?文档中引用的算法上的实际论文是否已经说明了这一点?或者,对OpenCV的实际实现有一点洞察力的人可以比界面文档更多地说明这一点吗?

opencv opencv-contour

12
推荐指数
1
解决办法
3084
查看次数

使用Python中的OpenCV访问轮廓边界内的像素值

我在Python 2.7.9上使用OpenCV 3.0.0.我正在尝试跟踪具有静止背景的视频中的对象,并估计其某些属性.由于图像中可能存在多个移动对象,因此我希望能够区分它们并在视频的剩余帧中单独跟踪它们.

我认为可以做到的一种方法是将图像转换为二进制,获取斑点的轮廓(在这种情况下为跟踪对象)并获取对象边界的坐标.然后我可以转到灰度图像中的这些边界坐标,获得由该边界包围的像素强度,并跟踪其他帧中的这种颜色梯度/像素强度.这样,我可以保持两个对象彼此分开,因此它们不会被视为下一帧中的新对象.

我有轮廓边界坐标,但我不知道如何检索该边界内的像素强度.有人可以帮帮我吗?

谢谢!

python opencv image image-processing opencv-contour

11
推荐指数
1
解决办法
2万
查看次数

OpenCV的cv2.boundingRect()函数如何工作?

我需要解释OpenCV的boundingRect.我已经实现了它,效果很好.请问有哪些参考资料完整解释?

c++ opencv python-2.7 opencv3.0 opencv-contour

10
推荐指数
1
解决办法
1万
查看次数

使用OpenCV(Python)改进轮廓检测

我正在尝试从照片中识别卡片.我设法做了我想要的理想照片,但我现在很难应用相同的程序,稍微不同的照明等.所以问题是关于使以下轮廓检测更健壮.

我需要分享我的代码的大部分内容,以便能够制作感兴趣的图像,但我的问题只涉及最后一个块和图像.

import numpy as np
import cv2
from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import math

img = cv2.imread('image.png')
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
plt.imshow(img)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后检测到卡片:

# Prepocess
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(1,1),1000)
flag, thresh = cv2.threshold(blur, 120, 255, cv2.THRESH_BINARY)
# Find contours
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea,reverse=True) 
# Select long perimeters only
perimeters = [cv2.arcLength(contours[i],True) for i in range(len(contours))]
listindex=[i for i in range(15) if perimeters[i]>perimeters[0]/2]
numcards=len(listindex)
# Show image
imgcont …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing opencv-contour

9
推荐指数
1
解决办法
7764
查看次数

使用 Open CV 获取轮廓内的平均颜色

所以我决定开始一起学习 Open CV 和 Python!

我的第一个项目是在相对静止的背景上检测移动物体,然后检测它们的平均颜色以对它们进行排序。至少有 10 个物体需要检测,我正在处理彩色视频。

到目前为止,我设法去除背景,识别轮廓(可选地获取每个轮廓的中心),但现在我正在努力获得每个轮廓内部的平均或平均颜色。有一些关于此类问题的主题,但其中大部分是用 C 编写的。显然我可以使用,cv.mean()但我无法获得一个工作掩码来提供此功能。我想这不是那么困难,但我被困在那里......干杯!

import numpy as np
import cv2

video_path = 'test.h264'

cap = cv2.VideoCapture(video_path)
fgbg = cv2.createBackgroundSubtractorMOG2()


while (cap.isOpened):

    ret, frame = cap.read()
    if ret==True:
        fgmask = fgbg.apply(frame)
        (contours, hierarchy) = cv2.findContours(fgmask, cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

        for c in contours:
            if cv2.contourArea(c) > 2000:
                cv2.drawContours(frame, c, -1, (255,0,0), 3)
        cv2.imshow('foreground and background',fgmask)
        cv2.imshow('rgb',frame)

    key = cv2.waitKey(1) & 0xFF

    if key == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

python opencv opencv-contour

8
推荐指数
2
解决办法
1万
查看次数

了解层次结构,来自 findContours opencv

我试图从 opencv c++ 中了解 Hierarchy 和 findContours,但我发现这很困难。

我确实在这里解决这个问题,但我仍然无法清楚地了解它。我尝试在不同的示例中使用它,使用以下示例图像

在此处输入图片说明

对于上图,运行以下代码,

    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>

    using namespace cv;
    using namespace std;

    Mat src; Mat src_gray;
    int thresh = 100;
    int max_thresh = 255;
    RNG rng(12345);

    void thresh_callback(int, void* );

    /** @function main */
    int main( int argc, char** argv )
    {
            src = imread( argv[1], 1 );
            cvtColor( src, src_gray, CV_BGR2GRAY );
            blur( src_gray, src_gray, Size(3,3) );

            String source_window = "Source";
            namedWindow( …
Run Code Online (Sandbox Code Playgroud)

c++ opencv opencv-contour

7
推荐指数
1
解决办法
6863
查看次数