我编写了以下非常简单的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) 我有处理数字信号的问题.我试图检测指尖,类似于此处介绍的解决方案:使用JavaCV进行手部和手指检测.
但是,我没有使用JavaCV而是使用OpenCV for android,这有点不同.我已经设法完成了本教程中介绍的所有步骤,但过滤了凸包和凸性缺陷.这是我的图像的样子:
这是另一个分辨率的图像:
你可以清楚地看到,有许多黄点(凸面船体)和许多红点(凸面效应).有时在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) 给出了由透视图扭曲的矩形的2d图片:
我知道形状最初是一个矩形,但我不知道它的原始大小.
如果我知道这张照片中角落的像素坐标,我该如何计算原始比例,即矩形的商(宽度/高度)?
(背景:目标是自动取消矩形文档的照片,边缘检测可能会用hough变换完成)
已经讨论了是否有可能根据给出的信息确定宽度:高度比.我天真的想法是它必须是可能的,因为我认为没有办法将例如1:4的矩形投射到上面描绘的四边形上.该比率显然接近1:1,因此应该有一种方法可以在数学上确定它.然而,除了我的直觉猜测,我没有证据证明这一点.
我还没有完全理解下面提出的论点,但我认为必须有一些隐含的假设,即我们在这里缺少这种假设并且有不同的解释.
然而,经过几个小时的搜索,我终于找到了一些与问题相关的论文.我很难理解那里使用的数学,到目前为止还没有成功.特别是第一篇论文似乎准确地讨论了我想要做的事情,遗憾的是没有代码示例和非常密集的数学.
张正友,何立伟,"白板扫描和图像增强" http://research.microsoft.com/en-us/um/people/zhang/papers/tr03-39.pdf p.11
"由于透视失真,矩形的图像看起来是四边形.但是,由于我们知道它是空间中的矩形,我们能够估计相机的焦距和矩形的纵横比."
ROBERT M. HARALICK"从矩形的透视投影中确定相机参数" http://portal.acm.org/citation.cfm?id=87146
"我们将展示如何使用3D空间中未知大小和位置的矩形的2D透视投影来确定相对于矩形平面图的相机视角参数."
geometry reverseprojection image-processing computer-vision projective-geometry
有谁知道OpenCV 2.3中FeatureDetection和DescriptorExtraction之间的区别?我知道后者是使用DescriptorMatcher进行匹配所必需的.如果是这种情况,FeatureDetection用于什么?
谢谢.
opencv image-processing feature-extraction computer-vision feature-detection
如何将灰度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) 我只是在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) 我import cv
在我的python代码中遇到了麻烦.
我的问题是我需要在图像中的感兴趣区域周围绘制一个矩形.怎么能在python中完成?我正在进行物体检测,并希望在我相信我在图像中找到的物体周围绘制一个矩形.
我只是喜欢冒险,迈出了我的第一步,迈向计算机视觉.我试图自己实现霍夫变换,但我只是没有全面了解.我阅读了维基百科条目,甚至是原始的"使用霍夫变换检测图片中的线条和曲线",由理查德·杜达和彼得·哈特,但没有帮助.
有人可以帮助用更友好的语言向我解释吗?
geometry pattern-recognition image-processing computer-vision hough-transform
我在视频(或图像)中有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的结果进行比较(由于迭代重投影误差最小化方法,这将更好).
这是一个例子:
正如你所看到的,黑色立方体或多或少都可以,但看起来并不均匀,尽管矢量看似正交.
EDIT2:我在计算它之后对v3进行了规范化(为了强制执行正交性),它似乎也解决了一些问题.
我试图将图像相互比较,以确定它们是否不同.首先,我尝试对RGB值进行Pearson相关,除非图像是轻微的位移,否则它的效果也相当不错.因此,如果一个100%相同的图像,但一个有点移动,我得到一个不好的相关值.
有关更好算法的任何建议吗?
顺便说一下,我正在谈论比较数千个图片......
编辑:以下是我的照片示例(微观):
IM1:
IM2:
IM3:
im1和im2是相同但有点移位/切割,im3应该被认为是完全不同的...
编辑: 问题是通过Peter Hansen的建议解决的!效果很好!感谢所有答案!一些结果可以在这里找到 http://labtools.ipk-gatersleben.de/image%20comparison/image%20comparision.pdf