标签: computer-vision

用opencv编写鲁棒(颜色和大小不变)圆检测(基于Hough变换或其他功能)

我编写了以下非常简单的python代码来查找图像中的圆圈:

import cv
import numpy as np

WAITKEY_DELAY_MS = 10
STOP_KEY = 'q'

cv.NamedWindow("image - press 'q' to quit", cv.CV_WINDOW_AUTOSIZE);
cv.NamedWindow("post-process", cv.CV_WINDOW_AUTOSIZE);

key_pressed = False
while key_pressed != STOP_KEY:

    # grab image
    orig = cv.LoadImage('circles3.jpg')

    # create tmp images
    grey_scale = cv.CreateImage(cv.GetSize(orig), 8, 1)
    processed = cv.CreateImage(cv.GetSize(orig), 8, 1)


    cv.Smooth(orig, orig, cv.CV_GAUSSIAN, 3, 3)

    cv.CvtColor(orig, grey_scale, cv.CV_RGB2GRAY)

    # do some processing on the grey scale image
    cv.Erode(grey_scale, processed, None, 10)
    cv.Dilate(processed, processed, None, 10)
    cv.Canny(processed, processed, 5, 70, 3)
    cv.Smooth(processed, …
Run Code Online (Sandbox Code Playgroud)

c c++ python opencv computer-vision

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

计算机视觉 - 用OpenCV过滤凸壳和凸面缺陷

我有处理数字信号的问题.我试图检测指尖,类似于此处介绍的解决方案:使用JavaCV进行手部和手指检测.

但是,我没有使用JavaCV而是使用OpenCV for android,这有点不同.我已经设法完成了本教程中介绍的所有步骤,但过滤了凸包和凸性缺陷.这是我的图像的样子:

分辨率640x480

这是另一个分辨率的图像:

第320x240号决议

你可以清楚地看到,有许多黄点(凸面船体)和许多红点(凸面效应).有时在2个黄点之间没有红点,这很奇怪(如何计算凸包?)

我需要的是创建类似于之前提供的链接的simillar过滤功能,但使用OpenCV的数据结构.

凸壳是MatOfInt的类型......凸性缺陷是MatOfInt4的类型......

我还创建了一些额外的数据结构,因为愚蠢的OpenCV在不同的方法中使用包含相同数据的不同类型的数据......

convexHullMatOfInt = new MatOfInt();
convexHullPointArrayList = new ArrayList<Point>();
convexHullMatOfPoint = new MatOfPoint();
convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所做的,但效果不佳.问题可能是以错误的方式转换数据:

创建凸包和凸面缺陷:

public void calculateConvexHulls()
{
    convexHullMatOfInt = new MatOfInt();
    convexHullPointArrayList = new ArrayList<Point>();
    convexHullMatOfPoint = new MatOfPoint();
    convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();

    try {
        //Calculate convex hulls
        if(aproximatedContours.size() > 0)
        {
            Imgproc.convexHull( aproximatedContours.get(0), convexHullMatOfInt, false);

            for(int j=0; j < convexHullMatOfInt.toList().size(); j++)
                convexHullPointArrayList.add(aproximatedContours.get(0).toList().get(convexHullMatOfInt.toList().get(j)));
            convexHullMatOfPoint.fromList(convexHullPointArrayList);
            convexHullMatOfPointArrayList.add(convexHullMatOfPoint);    
        }
    } catch (Exception e) {
        // TODO Auto-generated …
Run Code Online (Sandbox Code Playgroud)

java android opencv computer-vision

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

透视变形矩形的比例

给出了由透视图扭曲的矩形的2d图片:

在此输入图像描述

我知道形状最初是一个矩形,但我不知道它的原始大小.

如果我知道这张照片中角落的像素坐标,我该如何计算原始比例,即矩形的商(宽度/高度)?

(背景:目标是自动取消矩形文档的照片,边缘检测可能会用hough变换完成)

更新:

已经讨论了是否有可能根据给出的信息确定宽度:高度比.我天真的想法是它必须是可能的,因为我认为没有办法将例如1:4的矩形投射到上面描绘的四边形上.该比率显然接近1:1,因此应该有一种方法可以在数学上确定它.然而,除了我的直觉猜测,我没有证据证明这一点.

我还没有完全理解下面提出的论点,但我认为必须有一些隐含的假设,即我们在这里缺少这种假设并且有不同的解释.

然而,经过几个小时的搜索,我终于找到了一些与问题相关的论文.我很难理解那里使用的数学,到目前为止还没有成功.特别是第一篇论文似乎准确地讨论了我想要做的事情,遗憾的是没有代码示例和非常密集的数学.

geometry reverseprojection image-processing computer-vision projective-geometry

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

特征检测与描述符提取的区别

有谁知道OpenCV 2.3中FeatureDetection和DescriptorExtraction之间的区别?我知道后者是使用DescriptorMatcher进行匹配所必需的.如果是这种情况,FeatureDetection用于什么?

谢谢.

opencv image-processing feature-extraction computer-vision feature-detection

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

将OpenCV图像转换为黑白图像

如何将灰度OpenCV图像转换为黑白图像?我看到一个类似的问题已经被问过了,但是我正在使用OpenCV 2.3,而且建议的解决方案似乎不再适用.

我正在尝试将灰度图像转换为黑白图像,因此任何非绝对黑色的图像都是白色,并将其用作surf.detect()的遮罩,以便忽略在黑色遮罩区域边缘找到的关键点.

以下Python几乎让我,但发送到Threshold()的阈值似乎没有任何影响.如果我将其设置为0或16或128或255,结果是相同的,所有值> 128的像素变为白色,其他所有像素变为黑色.

我究竟做错了什么?

import cv, cv2
fn = 'myfile.jpg'
im_gray = cv2.imread(fn, cv.CV_LOAD_IMAGE_GRAYSCALE)
im_gray_mat = cv.fromarray(im_gray)
im_bw = cv.CreateImage(cv.GetSize(im_gray_mat), cv.IPL_DEPTH_8U, 1);
im_bw_mat = cv.GetMat(im_bw)
threshold = 0 # 128#255# HAS NO EFFECT!?!?
cv.Threshold(im_gray_mat, im_bw_mat, threshold, 255, cv.CV_THRESH_BINARY | cv.CV_THRESH_OTSU);
cv2.imshow('', np.asarray(im_bw_mat))
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing computer-vision

45
推荐指数
5
解决办法
13万
查看次数

module'对象没有属性'drawMatches'opencv python

我只是在OpenCV中做一个特征检测的例子.此示例如下所示.它给了我以下错误

module'对象没有属性'drawMatches'

我检查了OpenCV Docs,我不确定为什么会收到此错误.有谁知道为什么?

import numpy as np
import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread('box.png',0)          # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage

# Initiate SIFT detector
orb = cv2.ORB()

# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

# Match descriptors.
matches = bf.match(des1,des2)

# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)

plt.imshow(img3),plt.show()
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
File "match.py", line …
Run Code Online (Sandbox Code Playgroud)

python opencv image image-processing computer-vision

45
推荐指数
3
解决办法
4万
查看次数

如何在python中的感兴趣区域周围绘制一个矩形

import cv在我的python代码中遇到了麻烦.

我的问题是我需要在图像中的感兴趣区域周围绘制一个矩形.怎么能在python中完成?我正在进行物体检测,并希望在我相信我在图像中找到的物体周围绘制一个矩形.

python opencv draw computer-vision

45
推荐指数
3
解决办法
11万
查看次数

解释霍夫变换

我只是喜欢冒险,迈出了我的第一步,迈向计算机视觉.我试图自己实现霍夫变换,但我只是没有全面了解.我阅读了维基百科条目,甚至是原始的"使用霍夫变换检测图片中的线条和曲线",由理查德·杜达和彼得·哈特,但没有帮助.

有人可以帮助用更友好的语言向我解释吗?

geometry pattern-recognition image-processing computer-vision hough-transform

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

基于4个共面点计算具有单应矩阵的相机姿态

我在视频(或图像)中有4个共面点代表一个四边形(不一定是方形或矩形),我希望能够在它们顶部显示一个虚拟立方体,其中立方体的角正好位于角落视频四边形.

由于这些点是共面的,我可以计算单位平方的角(即[0,0] [0,1] [1,0] [1,1])和四边形的视频坐标之间的单应性.

根据这个单应性,我应该能够计算出正确的相机姿势,即[R | t],其中R是3x3旋转矩阵,t是3x1平移向量,因此虚拟立方体位于视频四边形上.

我已经阅读了很多解决方案(其中一些是关于SO的)并试图实现它们,但它们似乎仅在一些"简单"的情况下工作(例如当视频四边形是正方形时)但在大多数情况下不起作用.

以下是我尝试过的方法(大多数是基于相同的原理,只是翻译的计算略有不同).设K是摄像机的内在矩阵,H是单应性.我们计算:

A = K-1 * H
Run Code Online (Sandbox Code Playgroud)

设a1,a2,a3为A和r1,r2,r3的列向量,即旋转矩阵R的列向量.

r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)
Run Code Online (Sandbox Code Playgroud)

问题是在大多数情况下这不起作用.为了检查我的结果,我将R和t与OpenCV的solvePnP方法获得的结果进行了比较(使用以下3D点[0,0,0] [0,1,0] [1,0,0] [1,1 ,0]).

由于我以相同的方式显示立方体,我注意到在每种情况下solvePnP都提供了正确的结果,而从单应性中获得的姿势大多是错误的.

理论上,因为我的点是共面的,所以可以从单应性计算姿势,但是我找不到从H计算姿势的正确方法.

我对错误的看法有何见解?

尝试@Jav_Rock的方法后编辑

嗨Jav_Rock,非常感谢你的答案,我尝试了你的方法(以及其他许多方法)似乎或多或少都可以.然而,在基于4个共面点计算姿势时,我仍然遇到一些问题.为了检查结果,我将与solvePnP的结果进行比较(由于迭代重投影误差最小化方法,这将更好).

这是一个例子:

立方体

  • 黄色立方体:解决PNP
  • Black Cube:Jav_Rock的技巧
  • 青色(和紫色)立方体:一些其他技术给出完全相同的结果

正如你所看到的,黑色立方体或多或少都可以,但看起来并不均匀,尽管矢量看似正交.

EDIT2:我在计算它之后对v3进行了规范化(为了强制执行正交性),它似乎也解决了一些问题.

opencv computer-vision homography augmented-reality

44
推荐指数
4
解决办法
3万
查看次数

图像比较算法

我试图将图像相互比较,以确定它们是否不同.首先,我尝试对RGB值进行Pearson相关,除非图像是轻微的位移,否则它的效果也相当不错.因此,如果一个100%相同的图像,但一个有点移动,我得到一个不好的相关值.

有关更好算法的任何建议吗?

顺便说一下,我正在谈论比较数千个图片......

编辑:以下是我的照片示例(微观):

IM1:

在此输入图像描述

IM2:

在此输入图像描述

IM3:

在此输入图像描述

im1和im2是相同但有点移位/切割,im3应该被认为是完全不同的...

编辑: 问题是通过Peter Hansen的建议解决的!效果很好!感谢所有答案!一些结果可以在这里找到 http://labtools.ipk-gatersleben.de/image%20comparison/image%20comparision.pdf

python compare image image-processing computer-vision

43
推荐指数
4
解决办法
6万
查看次数