【发布时间】:2019-01-10 12:25:35
【问题描述】:
我正在使用 ORB 检测器来检测视频帧的关键点,但它给了我以下错误:
OpenCV Error: Assertion failed (img.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) in detectAsync
ORB 检测器的 CPU 功能工作正常。但不知何故,对于 GPU,它无法检测到图像的关键点。我也尝试过使用来自 CUDA 的 FastFeatureDetector,但它也失败了。
我在下面附上我的代码:
int main()
{
cv::VideoCapture input("/home/admin/Pictures/cars.mp4");
// Create image matrix
cv::Mat img,desc;
cv::cuda::GpuMat obj1;
// create vector keypoints
std::vector<cv::KeyPoint>keypoints;
// create keypoint detector
cv::Ptr<cv::cuda::ORB> detector = cv::cuda::ORB::create();
for(;;)
{
if(!input.read(img))
break;
obj1.upload(img);
detector->detect(obj1,keypoints, cv::cuda::GpuMat());
obj1.download(desc);
//Create cricle at keypoints
for(size_t i=0; i<keypoints.size(); i++)
cv::circle(desc, keypoints[i].pt, 2,cv::Scalar(0,0,255),1);
// Display Image
cv::imshow("img", desc);
char c = cv::waitKey();
// NOTE: Press any key to run the next frame
// Wait for a key to press
if(c == 27) // 27 is ESC key code
break;
}
}
主要问题是检测器将CV_8UC1作为Mat的输入格式。但我的图像格式是 CV_8UC3。我尝试使用img.convertTo(img1, CV_8UC1)转换该图像,但它仍然无法处理并抛出错误OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat。
【问题讨论】:
标签: c++ opencv computer-vision