- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 opencv 2.4.8 和 studio 2013,出现运行时错误。我的主要代码是这样的。
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include"SIFT.h"
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace cv;
using namespace std;
int main()
{
cout << "hello";
Mat image = imread("abc.jpg",0);
cout << image.channels() << endl;
SIFT controller(image);
controller.DoSIFT();
waitKey(100000);
}
我的头文件代码如下
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class SIFT{
private:
Mat image_orig;
Mat Scale_spaces[4][6];
Mat LOG_img[4][4];
Mat Extrema[4][2];
Mat image_temp;
Mat middle, up, down;
void BuildScaleSpace()
{
cout << "in build space" <<endl;
int i, j;
//image should be in grey scale
cout << endl<<image_temp.rows << image_temp.cols << endl;
GaussianBlur(image_temp, image_temp, cv::Size(5, 5), 0.5);
resize(image_temp, image_temp, Size(image_temp.cols * 2, image_temp.rows * 2), 0, 0, 1);
cout << image_temp.rows << image_temp.cols << endl;
Scale_spaces[0][0] =image_temp;
cout << endl << image_temp.rows << image_temp.cols << endl;
GaussianBlur(Scale_spaces[0][0], Scale_spaces[0][0], cv::Size(5, 5), 1);
double int_sigma = sqrt(2) / 2;
double sigma = int_sigma;;
double mid;
double power = 1.0;
for (i = 0; i < 4; i++)
{
if (i>0)
{
sigma = mid;
Scale_spaces[i][0] = image_temp;
resize(image_temp, Scale_spaces[i][0], Size(image_temp.cols / power, image_temp.rows / power), 0, 0, 1);
cout << endl << "after resizing" << Scale_spaces[i][0].rows << Scale_spaces[i][0].cols << endl;
}
for (j = 1; j <= 5; j++)
{
if (j == 2)
mid = sigma;
// printf(" %f ", sigma);
GaussianBlur(Scale_spaces[i][j-1], Scale_spaces[i][j], cv::Size(5, 5), sigma);
sigma = sigma*sqrt(2);
}
// printf("\n");
power = power * 2;
}
}
void ShowScaleSpace()
{
cout << "\n show scale\n\n";
namedWindow("image", CV_WINDOW_AUTOSIZE);
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j <= 5; j++)
{
cout << i<<" "<<j<<endl;
cout << Scale_spaces[i][j].rows<<" " << Scale_spaces[i][j].cols << endl;
imshow("image", Scale_spaces[i][j]);
cvWaitKey(700);
}
}
}
void FindLOG()
{
cout << endl << "IN LOG " << endl;
int i;
int j;
for (i = 0; i < 4; i++)
{
for (j = 1; j < 5; j++)
{
addWeighted(Scale_spaces[i][j], 1, Scale_spaces[i][j + 1], -1,0, LOG_img[i][j - 1]);
}
}
}
void FindMaxMin()
{
cout << endl << "IN findmaxmin " << endl;
int i;
int j;
int xiter, yiter;
for (i = 0; i < 4; i++)
{
for (j = 1; j < 3; j++)
{
std::cout << LOG_img[i][j].channels();
middle = LOG_img[i][j].clone();
up = LOG_img[i][j - 1].clone();
down = LOG_img[i][j + 1].clone();
for (yiter = 1; yiter < middle.rows-1; yiter++)
{
for (xiter = 1; xiter < middle.cols-1; xiter++)
{
cout << i << " " << j << " " << yiter << " " << xiter<< " "<<endl;
double currentPixel = middle.at<uchar>(yiter, xiter);
cout << "1 ";
// Check for a maximum
if (cout << "helllo 2hhukjhgkj"&¤tPixel> middle.at<uchar>(yiter, xiter + 1) &&
currentPixel> middle.at<uchar>(yiter, xiter - 1) &&
currentPixel > middle.at<uchar>(yiter + 1, xiter) &&
currentPixel > middle.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel > middle.at<uchar>(yiter, xiter + 1) &&
currentPixel > middle.at<uchar>(yiter - 1, xiter) &&
currentPixel > middle.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel > middle.at<uchar>(yiter - 1, xiter - 1) &&
currentPixel > up.at<uchar>(yiter, xiter) &&
currentPixel > up.at<uchar>(yiter, xiter + 1) &&
currentPixel > up.at<uchar>(yiter, xiter - 1) &&
currentPixel > up.at<uchar>(yiter + 1, xiter) &&
currentPixel > up.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel > up.at<uchar>(yiter, xiter + 1) &&
currentPixel > up.at<uchar>(yiter - 1, xiter) &&
currentPixel > up.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel > up.at<uchar>(yiter - 1, xiter - 1) &&
currentPixel > down.at<uchar>(yiter, xiter) &&
currentPixel > down.at<uchar>(yiter, xiter + 1) &&
currentPixel > down.at<uchar>(yiter, xiter - 1) &&
currentPixel > down.at<uchar>(yiter + 1, xiter) &&
currentPixel > down.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel > down.at<uchar>(yiter, xiter + 1) &&
currentPixel > down.at<uchar>(yiter - 1, xiter) &&
currentPixel > down.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel > down.at<uchar>(yiter - 1, xiter - 1)
)
{
cout << "inside, updating extrema ";
Extrema[i][j - 1].at<uchar>(xiter, yiter) = 255;
}
else if (currentPixel< middle.at<uchar>(yiter, xiter + 1) &&
currentPixel< middle.at<uchar>(yiter, xiter - 1) &&
currentPixel < middle.at<uchar>(yiter + 1, xiter) &&
currentPixel < middle.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel < middle.at<uchar>(yiter, xiter + 1) &&
currentPixel < middle.at<uchar>(yiter - 1, xiter) &&
currentPixel < middle.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel < middle.at<uchar>(yiter - 1, xiter - 1) &&
currentPixel < up.at<uchar>(yiter, xiter) &&
currentPixel < up.at<uchar>(yiter, xiter + 1) &&
currentPixel < up.at<uchar>(yiter, xiter - 1) &&
currentPixel < up.at<uchar>(yiter + 1, xiter) &&
currentPixel < up.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel < up.at<uchar>(yiter, xiter + 1) &&
currentPixel < up.at<uchar>(yiter - 1, xiter) &&
currentPixel < up.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel < up.at<uchar>(yiter - 1, xiter - 1) &&
currentPixel < down.at<uchar>(yiter, xiter) &&
currentPixel < down.at<uchar>(yiter, xiter + 1) &&
currentPixel < down.at<uchar>(yiter, xiter - 1) &&
currentPixel < down.at<uchar>(yiter + 1, xiter) &&
currentPixel < down.at<uchar>(yiter + 1, xiter - 1) &&
currentPixel < down.at<uchar>(yiter, xiter + 1) &&
currentPixel < down.at<uchar>(yiter - 1, xiter) &&
currentPixel < down.at<uchar>(yiter - 1, xiter + 1) &&
currentPixel < down.at<uchar>(yiter - 1, xiter - 1)
)
{
Extrema[i][j - 1].at<uchar>(xiter, yiter) = 255;
}
else
Extrema[i][j - 1].at<uchar>(xiter, yiter) = 0;
}
}
}
}
}
public:
SIFT(Mat Image)
{
image_orig = Image;
image_temp = Image;
}
void DoSIFT()
{
BuildScaleSpace();
//ShowScaleSpace();
FindLOG();
FindMaxMin();
}
};
构建成功,但在运行时显示以下错误。
错误可能在 FindMaxMin() 函数和这一行中
currentPixel> middle.at<uchar>(yiter, xiter + 1)
但我无法纠正它。
最佳答案
抱歉,@user2396315,我没有经常访问这里。
问题是您没有使用正确大小和类型的 Mat::create() 初始化“Extrema”。您只声明了它“Mat Extrema[4][2];”
所以在 if else 之后......
Extrema[i][j - 1].at<uchar>(xiter, yiter) = ??? ;
将访问一个空的垫子“Extrema[i][j - 1]”。
你可以放
if( Extrema[i][j - 1].empty() == true )
cerr << "Fatal error" << endl ;
在它之前你会看到。
在使用之前,请始终通过 Mat::empty() 检查您的 Mat。这就是我在此 post 处“检查尺寸”的意思.我不是要检查数组的大小。
请记住,“断言失败”通常意味着您传递了一个空的 Mat 或尺寸不符合预期的 Mat。
关于c++ - 执行 SIFT 算法时出现断言错误 :opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587103/
我想找到一种方法,允许将图像(查询)的 SIFT 描述符与包含大量不同图片描述符的 SQL 数据库中的描述符进行比较。 事实上,我的最终目的是做一个应用程序,允许将一张图片与数据库(不是在我的设备中)
我正在使用 OpenCV 实现词袋图像分类器。最初我测试了在 SURF 关键点中提取的 SURF 描述符。我听说 Dense SIFT(或 PHOW)描述符更适合我的目的,所以我也尝试了它们。 令我惊
我尝试使用 David Lowe's implementation 对几个不同的对象进行对象检测和 OpenCV implementation (只是在此代码中更改了 'SurfFeatureDete
我正在尝试为我的项目实现 SIFT,我已经掌握了关键点。我尝试使用同一图像的所有关键点获取图像的每个关键点的欧氏距离,但按比例缩小。碰巧查询图像的 1 个关键点与数据库图像中其余关键点的距离具有非常相
我想通过旋转它们来标准化筛选描述符,以便水平方向与补丁的主要梯度方向对齐。 我正在使用 vl_feat 库。 vl_feat 中是否有任何方法可以规范筛选描述? 或 使用 matlab 执行此操作的有
我想使用基于FLANN的Matcher打印检测功能关键点 算法:http://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html。 搜索效果很好
SIFT 是做什么的?它是否建立了 View 之间的特征对应关系?它是否接收图像的角并删除那些没有描述性的角?它会进行匹配吗? 最佳答案 SIFT 是“尺度不变特征变换”的捷径。SIFT 特征通常用于
我正在尝试实现 SIFT,目前我只是想了解它是如何工作的,然后再开始在 MATLAB 中实现它,我了解其中的大部分内容,除了如何使用泰勒展开计算亚像素精度: 以上是原始论文中的方程式。我有几个关于它如
我在 matlab 中使用 SIFT 算法来确定模板图像和一组图像之间的相似性,最后我必须根据 SCORES 确定一组图像之间的最佳匹配,这样说对吗图像的分数越高匹配越好?我知道当存在完全匹配时,分数
我是 Opencv2.3 的入门级程序员,玩弄互联网上可用的代码和各种有用的资源。有 Stack User 实现的代码 User:Froyo在他的网站上 website .当我尝试执行代码时,只要我在
我在执行我的代码时遇到以下错误:(带有 Qt Creator 的 OpenCV) OpenCV Error: Assertion failed (!outImage.empty()) in drawK
我正在使用 OpenCV-Python。 我已经使用 cv2.cornerHarris 识别角点。输出类型为 dst。 我需要计算角点的 SIFT 特征。 sift.compute() 的输入必须是
我读过一些关于 SIFT 的文献,也看过一些视频。我了解 SIFT 背后的大部分概念,但让我感到困惑的是关于 SIFT 描述符的一件事。 在筛选中: 我们找到了一个关键点 我们在关键点周围取 16 x
有 2 张图像 A 和 B。我从中提取关键点(a[i] 和 b[i])。 我想知道如何有效地确定 a[i] 和 b[j] 之间的匹配? 我想到的最明显的方法是将 A 中的每个点与 B 中的每个点进行比
我正在开发一个应用程序,我在其中使用 SIFT + RANSAC 和 Homography 来查找对象(OpenCV C++、Java)。我面临的问题是,在有很多异常值的地方,RANSAC 表现不佳。
我正在开展一个项目,我将使用单应性作为分类器中的特征。我的问题是自动计算单应性,我使用 SIFT 描述符来找到两个图像之间的点来计算单应性,但是 SIFT 给我的结果很差,因此我不能在我的工作中使用它
我想知道,如果我可以更改 SIFT 描述符维度,如果可以,我该怎么做。我知道目前尺寸是 128,我们可以做成 128*4 或 124/4 这样的尺寸吗? 更新:我试图将 SIFT_DESCR_WIDT
我在树莓派 3b 上使用 opencv 4.5.0-pre 和 python 3.7.3。我正在尝试使用 SIFT 为图像拼接找到最匹配的特征。我使用本指南从源代码构建了 opencv https:/
我目前在 工作SIFT ,我已经生成了高斯和极值图像层的差异。谁能向我解释如何使用 Hessian 矩阵来消除低对比度关键点? 最佳答案 一个好的关键点是一个角落。这首先来自 Harris 角工作和
我在 OpenCV 4.5.2 中使用 SIFT 特征检测器.通过调整 nOctaveLayers cv::SIFT::create() 中的参数, 我从 detectAndCompute() 得到这
我是一名优秀的程序员,十分优秀!