标签: feature-detection

如何为多边形逼近确定cvCanny的最佳参数

这是我的源图像(忽略点,稍后手动添加):

在此输入图像描述

我的目标是获得两只手的粗略多边形近似.像这样的东西:

在此输入图像描述

我对如何做到这一点有一个大概的想法; 我想用来cvCanny找到边缘,cvFindContours找到轮廓,然后cvApproxPoly.

我面临的问题是我不知道如何正确使用cvCanny,特别是我应该使用什么来处理最后3个参数(threshold1&2,apertureSize)?我试过做:

cvCanny(source, cannyProcessedImage, 20, 40, 3);
Run Code Online (Sandbox Code Playgroud)

但结果并不理想.左手看起来相对较好,但右手检测得很少:

在此输入图像描述

一般来说,它不像我想的那么可靠.有没有办法猜测Canny的"最佳"参数,或者至少是一个详细的解释(初学者可以理解)他们做了什么,所以我可以做出有根据的猜测?或者也许有更好的方法来完成这项工作?

c opencv computer-vision edge-detection feature-detection

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

从图像中检测并提取面部

我一直在尝试执行以下操作 - 当用户在我的网络应用程序中上传图像时,我想在其中检测到他/她的脸并从中提取脸部(从额头到下巴和脸颊到脸颊).

  • 我尝试使用Haar Cascade进行OpenCV/C++人脸检测,但问题在于它给出了面部所在位置的概率,因为图像背景进入ROI内部甚至整个面部都没有进入ROI.我也想检测面部内的眼睛,并且在使用上述技术时,眼睛检测并不准确.

  • 我已经阅读了一种名为Active Appearance Model(AAM)的新技术.我在这里阅读的博客表明,这正是我想要的,但我对如何实现这一点感到很遗憾.

我的疑问是 -

  1. 使用AAM是人脸检测和人脸特征检测的好主意.
  2. 有没有其他技术可以做同样的事情.

任何这些的任何帮助非常感谢.

谢谢 !

c++ opencv feature-extraction face-detection feature-detection

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

undistort vs. undistortPoints用于校准图像的特征匹配

我试图找到捕获相同场景的两个摄像机(或实际上是一个移动摄像机)之间的欧几里德变换,其中校准数据K(内部参数)和d(失真系数)是已知的.我这样做是通过提取特征点,匹配它们并使用最佳匹配作为对应关系.

在调整大小/特征检测/等之前.我undistort两个图像

undistort(img_1, img_1_undist, K, d);
undistort(img_2, img_2_undist, K, d);
Run Code Online (Sandbox Code Playgroud)

表格img_.中的输入在哪里Mat获得imread.但实际上我只需要最终用作对应的特征的未失真坐标,而不是所有图像像素的坐标,因此它将更有效,而不是undistort整个图像,而只是关键点.我认为我可以做到这一点undistortPoints,但这两种方法导致不同的结果.

我调整图像大小

 resize(img_1_undist, img_1_undist, Size(img_1_undist.cols / resize_factor,
            img_1_undist.rows / args.resize_factor));
 resize(img_2_undist, img_2_undist, Size(img_2_undist.cols / resize_factor,
            img_2_undist.rows / args.resize_factor));
 // scale matrix down according to changed resolution
 camera_matrix = camera_matrix / resize_factor;
 camera_matrix.at<double>(2,2) = 1;
Run Code Online (Sandbox Code Playgroud)

在获得最佳匹配后matches,我std::vector为所述匹配的坐标构建s,

    // Convert correspondences to vectors
    vector<Point2f>imgpts1,imgpts2;
    cout << "Number of matches " << matches.size() << …
Run Code Online (Sandbox Code Playgroud)

c++ opencv computer-vision feature-detection camera-calibration

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

带有多行的RANSAC被检测

这是一个理论问题,但是我想知道当图像中有多条线要检测时,人们如何随机选择点。到目前为止,在大多数示例中,似乎只有一条线可被检测到,这似乎很容易。但是,我不确定如何扩展它以检测更多点的多条线。

image-processing computer-vision feature-detection ransac

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

最好的特征检测是什么?

我们有两张图像,一张作为参考,另一张我们想要使用 Matlab 来像参考一样对齐。为此,我们需要在两个图像中找到相似点,然后使用最小二乘法计算核矩阵进行变换,如下代码所示:

clear all; close all; clc; imtool close all;
      I1 = rgb2gray(im);
      I2 = rgb2gray(ref);
      points1 = detectSURFFeatures(I1);
      points2 = detectSURFFeatures(I2);
      [features1,valid_points1] = extractFeatures(I1,points1,'SURFSize',64);
      [features2,valid_points2] = extractFeatures(I2,points2,'SURFSize',64);
      indexPairs = matchFeatures(features1,features2);
      matchedPoints1 = valid_points1(indexPairs(:,1),:);
      matchedPoints2 = valid_points2(indexPairs(:,2),:);
      [tform, correct1,correct2] = estimateGeometricTransform(matchedPoints1,matchedPoints2,'projective','MaxNumTrials',100000,'Confidence',99.9999,'MaxDistance',4);
      sourcepoints = correct1.Location;
      targetpoints = correct2.Location;
      sizenum = size(sourcepoints,1);
      x_source = sourcepoints(:,1);
      y_source = sourcepoints(:,2);
      x_target = targetpoints(:,1);
      y_target = targetpoints(:,2);
      zero_vec = zeros([sizenum,1]);
      one_vec = ones([sizenum,1]);
      H = [x_source,y_source,one_vec,zero_vec,zero_vec,zero_vec,-x_source.*x_target,-y_source.*x_target;...
           zero_vec,zero_vec,zero_vec,x_source,y_source,one_vec,-x_source.*y_target,-y_source.*y_target];
      Y = [x_target;y_target];
      variables = (inv(H'*H))*H'*Y;
      variables(9) …
Run Code Online (Sandbox Code Playgroud)

matlab image-processing feature-extraction feature-detection

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

使用SIFT描述符的OpenCV(C++)增加了检测到的功能的数量?

在使用OpenCV 的SIFT描述符实现时,我有点混乱.

我正在尝试测试各种特征检测器+描述符计算方法,所以我使用了cv::FeatureDetectorcv::DescriptorExtractor接口的组合,这使我可以简单地在不同的检测器方法和描述符之间进行更改.

在调用cv::DescriptorExtractor::compute(...)(单个图像的变体)时,文档说如果无法计算描述符,那么给予算法的关键点数量可能会减少,我理解这样做的原因和原因.

但是,我发生的事情是描述符计算后关键点的数量实际上增加了.显然是这样,我并不是想阻止它发生,我只是希望解释为什么(只是一个直观的描述会很酷,尽管我更欣赏它).

我在实际的OpenCV周围有多层包装层没有任何代码(只是设置一些本地非OpenCV标志),所以这里是在其底部调用的OpenCV代码:

cv::Ptr<cv::FeatureDetector> dect = cv::FeatureDetector::create("MSER");
cv::Mat input = cv::imread("someImg.ppm", 0);
std::vector<cv::KeyPoint> keypoints;
dect->detect(input, keypoints);

cv::Ptr<cv::DescriptorExtractor>deEx=cv::DescriptorCalculator::create("SIFT");

std::cout << "before computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features

cv::Mat desc;
deEx->compute(input, keypoints, desc);

std::cout << "after computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
Run Code Online (Sandbox Code Playgroud)

我在描述符计算之前和之后打印出前10个关键点,所以这里有一些具体数字作为例子:

before computing, feats size 379
feat[0]: …
Run Code Online (Sandbox Code Playgroud)

c++ opencv sift feature-detection

0
推荐指数
1
解决办法
6083
查看次数

如何实现从二进制图像中提取多个要素的方法

我正在用java实现一个简单的计算机视觉系统.它从图像中提取形状.其通常为圆形或椭圆形.我有它的工作,它可以创建一个二进制图像,只包含我想要分析的功能.通过计算图像中的白色像素数,我可以轻松地找到单个特征的区域.但是,如果有多个功能,它会找到所有功能的区域.

我想知道是否有人知道如何实现提取/检测多个功能的方法,然后我可以很容易地找到每个区域等.

我已经找到了如何用OpenCV的做的信息,但是我无法找到如何真正实现的方法为自己,或力挺如何实现它的理论信息..它不必须是非常先进的,甚至一个简单的例子没关系.

任何建议将不胜感激!

java feature-extraction computer-vision feature-detection

0
推荐指数
1
解决办法
1027
查看次数

如何发现数据集中的哪些特征具有预测性?

我正在研究这里提供的数据集的机器学习算法.

共有26列数据.大部分都是毫无意义的.我怎样才能有效,快速地确定哪些特征是有趣的 - 哪些特征告诉我这样或那样的特定URL是短暂的还是常绿的(这是数据集中的因变量)?是否有智能的,程序化的scikit学习如何做到这一点,或者它只是一个图形的每个功能对依赖功能('标签',第26列)的图形,并看到有什么影响?

肯定有比这更好的方法!

有人可以帮忙吗?:)

编辑:我找到的分类器的一些代码 - 如何在这里打印出给每个功能的权重?

import numpy as np
import matplotlib.pyplot as plt
  from sklearn import metrics,preprocessing,cross_validation
  from sklearn.feature_extraction.text import TfidfVectorizer
  import sklearn.linear_model as lm
  import pandas as p
  loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter=' ')

  print "loading data.."
  traindata = list(np.array(p.read_table('train.tsv'))[:,2])
  testdata = list(np.array(p.read_table('test.tsv'))[:,2])
  y = np.array(p.read_table('train.tsv'))[:,-1]

  tfv = TfidfVectorizer(min_df=3,  max_features=None, strip_accents='unicode',  
        analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)

  rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                             C=1, fit_intercept=True, intercept_scaling=1.0, 
                             class_weight=None, random_state=None)

  X_all = traindata + testdata
  lentrain = len(traindata) …
Run Code Online (Sandbox Code Playgroud)

python artificial-intelligence machine-learning feature-detection scikit-learn

0
推荐指数
1
解决办法
1138
查看次数

OpenCV SIFT关键点提取是真的

我试图提取SIFT关键点.它适用于我下载的示例图像(height 400px width 247px horizontal and vertical resolutions 300dpi).下图显示了提取的点.

在此输入图像描述

然后我尝试将相同的代码应用于由我(height 443px width 541px horizontal and vertical resolutions 72dpi)拍摄和编辑的图像.

在此输入图像描述

为了创建上面的图像,我旋转了原始图像,然后删除了它的背景,并使用Photoshop调整了它的大小,但我的代码,对于该图像,不提取像第一张图像中的功能.

看结果:

在此输入图像描述

它只提取了很少的几点.我希望结果与第一种情况一样.对于第二种情况,当我使用原始图像而没有任何编辑时,程序给出了第一种情况的分数.这是我使用的简单代码

#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<opencv2\nonfree\nonfree.hpp>

using namespace cv;

int main(){

Mat src, descriptors,dest;
vector<KeyPoint> keypoints;

src = imread(". . .");


cvtColor(src, src, CV_BGR2GRAY);

SIFT sift;
sift(src, src, keypoints, descriptors, false);
drawKeypoints(src, keypoints, dest);
imshow("Sift", dest);
cvWaitKey(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?在调整大小后,我需要做些什么才能在第一种情况下将结果输出到我自己的图像中?

谢谢!

c++ opencv image-processing sift feature-detection

0
推荐指数
1
解决办法
4963
查看次数

OpenCV计算时间检测功能

我正在尝试计算我的程序从图像中检测关键点所需的时间。如果在我的 C++ 程序中我执行两次(使用相同的图像),则两者之间存在巨大差异。第一次大约用 600-800 毫秒,第二次只用 100-200 毫秒。

有谁知道发生了什么事?

这是我获取时间的代码:

struct timeval t1, t2;

Ptr<SURF> detector = SURF::create(400);

gettimeofday(&t1, 0x0);

detector->detect( imagen1, keypoints_1 );

gettimeofday(&t2, 0x0);

int milliSeconds = Utils::calculateDiff(t1, t2);
Run Code Online (Sandbox Code Playgroud)

这是我计算差异的代码:

static int calculateDiff(timeval t1, timeval t2)
{
    return (t2.tv_sec - t1.tv_sec) * 1000 + (t2.tv_usec - t1.tv_usec)/1000;
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例:

样本

c++ opencv surf feature-detection

0
推荐指数
1
解决办法
9876
查看次数

如何使用 Python 和 OpenCV 实现 KAZE 和 A-KAZE?

我正在尝试在航拍图像上实现KAZEA-KAZE使用PythonOpenCV进行特征检测和描述

代码是什么?

另外,特征匹配应该使用什么描述符?

python opencv feature-extraction feature-detection feature-descriptor

0
推荐指数
1
解决办法
1045
查看次数

我可以使用OpenCV来分析图像内容吗?

我想检测图像的内容.

在此输入图像描述

例如,我想使用上面的图像作为输入,并获得如下的术语输出列表:天空,水,海,建筑物等.

知道怎么开始吗?

opencv detection feature-detection

-6
推荐指数
1
解决办法
1764
查看次数