OpenCV与cv::FAST有问题
OpenCV Having issues with cv::FAST
我正在尝试使用开放式CV FAST算法来检测视频源中的角点。方法调用和设置看起来很直接,但我遇到了一些问题。当我尝试使用这个代码
while(run)
{
clock_t begin,end;
img = cvQueryFrame(capture);
key = cvWaitKey(10);
cvShowImage("stream",img);
//Cv::FAST variables
int threshold=9;
vector<KeyPoint> keypoints;
if(key=='a'){
//begin = clock();
Mat mat(tempImg);
FAST(mat,keypoints,threshold,true);
//end = clock();
//cout << "n TIME FOR CALCULATION: " << double(diffClock(begin,end)) << "n" ;
}
我得到这个错误:
OpenCV错误:断言失败(image.data&-image.type()==CV_8U),未知函数,文件。。。。。。。。\ocv\opencv\src\cvax\cvfast.cpp,第6039行
所以我认为这是图像深度的问题,所以当我添加这个时:
IplImage* tempImg = cvCreateImage(Size(img->width,img->height),8,1);
cvCvtColor(img,tempImg,CV_8U);
我得到:
OpenCV错误:通道数不正确(此conv的通道数不错误版本代码),文件。。。。。。。。\ocv\opencv\src\cv\cvcolor.cpp,线路2238
我试过用Mat而不是IplImage来捕捉,但我总是遇到同样的错误。
有什么建议或帮助吗?提前谢谢。
整个文件只是为了让任何人都更容易:
#include "cv.h"
#include "cvaux.hpp"
#include "highgui.h"
#include <time.h>
#include <iostream>
double diffClock(clock_t begin, clock_t end);
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//Create Mat img for camera capture
IplImage* img;
bool run = true;
CvCapture* capture= 0;
capture = cvCaptureFromCAM(-1);
int key =0;
cvNamedWindow("stream", 1);
while(run)
{
clock_t begin,end;
img = cvQueryFrame(capture);
key = cvWaitKey(10);
cvShowImage("stream",img);
//Cv::FAST variables
int threshold=9;
vector<KeyPoint> keypoints;
if(key=='a'){
//begin = clock();
IplImage* tempImg = cvCreateImage(Size(img->width,img->height),8,1);
cvCvtColor(img,tempImg,CV_8U);
Mat mat(img);
FAST(mat,keypoints,threshold,true);
//end = clock();
//cout << "n TIME FOR CALCULATION: " << double(diffClock(begin,end)) << "n" ;
}
else if(key=='x'){
run= false;
}
}
cvDestroyWindow( "stream" );
return 0;
}
当您在使用OpenCV API时遇到问题时,请检查源代码中提供的测试/示例:fast.cpp
这种做法非常有用,非常有教育意义。现在,如果你看一下代码,你会注意到图像在调用cv::FAST()
之前被转换为灰度:
Mat mat(tempImg);
Mat gray;
cvtColor(mat, gray, CV_BGR2GRAY);
FAST(gray,keypoints,threshold,true);
看起来确实很直接。
您需要更改此
cvCvtColor(img,tempImg,CV_8U);
至
cvCvtColor(img,tempImg,CV_BGR2GRAY);
你可以阅读这个
好运
我开始用以前工作过的代码得到同样的消息,我确信我的Mat是U8灰度级的。事实证明,我试图处理的一张照片已经不在了。所以在我的情况下,这是一个误导性的错误信息。
看看这个示例代码。您正在使用的代码看起来相当过时opencv,在这个示例中,您将发现现在应该如何使用特征检测器。该样本对于几个特征检测器(包括FAST)来说是通用的,所以看起来有点复杂。
http://code.opencv.org/projects/opencv/repository/entry/branches/2.4/opencv/samples/cpp/matching_to_many_images.cpp
您还会在父目录中找到更多示例。
请按照以下代码操作以获得您想要的结果。为了展示一个例子,我只考虑一个图像,但你可以简单地对视频帧使用相同的想法
Mat img = imread("IMG.jpg", IMREAD_UNCHANGED);
if( img.empty())
{
cout << "File not available for reading"<<endl;
return -1;
}
Mat grayImage;
if(img.channels() >2){
cvtColor( img, grayImage, CV_BGR2GRAY ); // converting color to gray image
}
else{
grayImage = img;
}
double sigma = 1;
GaussianBlur(grayImage, grayImage, Size(), sigma, sigma); // applying gaussian blur to remove some noise,if present
int thresholdCorner = 40;
vector<KeyPoint> keypointsCorners;
FAST(grayImage,keypointsCorners,thresholdCorner,true); // applying FAST key point detector
if(keypointsCorners.size() > 0){
cout << keypointsCorners.size() << endl;
}
// Drawing a circle around corners
for( int i = 0; i < keypointsCorners.size(); i++ )
{
circle( grayImage, keypointsCorners.at(i).pt, 5, Scalar(0), 2, 8, 0 );
}
cv::namedWindow("Display Image");
cv::imshow("Display Image", grayImage);
cvWaitKey(0);
cvDestroyWindow( "Display Image" );
- 我似乎对if/else的基本语句有问题:/
- 我在范围内未声明的错误类有问题
- 我的C++语言蛮力算法有问题
- 我关于函数"Assert"的C++代码有问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++类中的友元函数有问题?
- 我对数组即 0x6dfe78 有问题
- 我对 std::unique(算法)C++有问题
- 使用 fstream 库并在屏幕上打印的文件有问题?
- 这个模板为什么有问题?如何正确编译
- 我对 MyGraph 属性顶点名称和边权重有问题
- delete[]有问题,如何部分删除内存
- 在C++中使用exit()退出程序有问题吗
- 跳转到if(false)块有问题吗
- 查找有问题的宏
- 使用 rand() 和 srand() 有问题
- C++ 回文程序总是给出 0(假)作为输出问题;我的代码哪里有问题?
- 我在 C++ "out_of_range at memory location"有问题
- 我在 c++ 中的 AES 代码有问题。明文正在更改,但加密邮件是相同的。我找不到我的错误
- OpenCV与cv::FAST有问题