- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想迁移到使用 opencv 来获取自定义成像检测器数据。数据集可能非常大(有时是数千帧的数百帧),我使用增强内存映射加载它们。在测试行为时,我创建了一个适当大小的 cv::mat(对于单个帧)并将指针更改为我正在查看的帧的数据。这适用于显示数据 (cv::imshow) 或应用颜色图,但当我使用类似 cv::filter2D 的东西时失败。如果我克隆数据或使用一些拷贝,它会起作用,但我不想开始复制/克隆,因为我认为这会降低性能(也许我错了)。
那么 - 我做错了什么?为什么 cv::filter2D 在这里不起作用,还有更好的方法吗?
在运行时(现在使用 Windows 10)我在终端中得到以下信息:
OpenCV(4.0.1) Error: Assertion failed (data == datastart + ofs.y*step[0] + ofs.x*esz) in cv::Mat::locateROI, file c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\matrix.cpp, line 767
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(4.0.1) Error: Assertion failed (data == datastart + ofs.y*step[0] + ofs.x*esz) in cv::Mat::locateROI, file c:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\matrix.cpp, line 767
只有当 filter2D 与从内存映射数组构造的矩阵一起使用时才会发生这种情况。
我在克隆版本未注释的情况下运行程序,并将循环中的 std::cout 行替换为:
std::cout<<"Is it continuous: " << img.isContinuous() << std::endl;
而且 cv::Mat 确实是连续的。
#include <QCoreApplication>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include<iostream>
#include <boost/iostreams/device/mapped_file.hpp>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
boost::iostreams::mapped_file_source mem_ifile;
mem_ifile.open(std::string("someimage.raw"));
std::cout<<"file size: "<<mem_ifile.size()/(396*266*sizeof (float))<<std::endl;
cv::Mat adjMap;
cv::Mat img(266,396,CV_32FC1);
cv::Mat falseColorsMap;
cv::Mat b_hist;
cv::Mat kernel;
cv::Mat filsMap;
kernel = cv::Mat::ones( 2, 2,CV_32FC1)/double(4.0);
cv::namedWindow("image", cv::WINDOW_NORMAL);
cv::namedWindow("false color", cv::WINDOW_NORMAL);
cv::namedWindow("filtered", cv::WINDOW_NORMAL);
for(unsigned long long i = 0;i< mem_ifile.size()/(396*266*sizeof (float)); i++)
{
img.data = (reinterpret_cast<uchar *>(const_cast<char *>(mem_ifile.data()))+(i*396*266*sizeof (float)));
cv::convertScaleAbs(img, adjMap, 255 / 500.0);
applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_JET);
// PROBLEM HERE - FIRST TWO WORK, LAST ONE DOESN'T
//cv::filter2D(adjMap,filsMap,-1,kernel); // works
//cv::filter2D(img.clone(),filsMap,-1,kernel); // works
cv::filter2D(img,filsMap,-1,kernel); // doesn't work
std::cout<<"mean of adjmap: " << cv::mean(adjMap) << std::endl;
cv::imshow("image", adjMap);
cv::imshow("false color",falseColorsMap);
cv::imshow("filtered", filsMap);
cv::waitKey(20);
}
mem_ifile.close();
return a.exec();
}
基于 Beaker 建议的工作代码:
#include <QCoreApplication>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include<iostream>
#include <boost/iostreams/device/mapped_file.hpp>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
boost::iostreams::mapped_file_source mem_ifile;
mem_ifile.open(std::string("/home/hugh/Documents/APS2017April/Ti7_nr2_e_x36000.raw"));
std::cout<<"file size: "<<mem_ifile.size()/(396*266*sizeof (float))<<std::endl;
cv::Mat adjMap;
cv::Mat *img;
cv::Mat falseColorsMap;
cv::Mat b_hist;
cv::Mat kernel;
cv::Mat filsMap;
kernel = cv::Mat::ones( 2, 2,CV_32FC1)/double(4.0);
cv::namedWindow("image", cv::WINDOW_NORMAL);
cv::namedWindow("false color", cv::WINDOW_NORMAL);
cv::namedWindow("filtered", cv::WINDOW_NORMAL);
for(unsigned long long i = 0;i< mem_ifile.size()/(396*266*sizeof (float)); i++)
{
//img.data = (reinterpret_cast<uchar *>(const_cast<char *>(mem_ifile.data()))+(i*396*266*sizeof (float)));
img = new cv::Mat(266,396,CV_32FC1,(reinterpret_cast<uchar *>(const_cast<char *>(mem_ifile.data()))+(i*396*266*sizeof (float))));
cv::convertScaleAbs(*img, adjMap, 255 / 500.0);
applyColorMap(adjMap, falseColorsMap, cv::COLORMAP_JET);
//cv::filter2D(adjMap,filsMap,-1,kernel); // works
//cv::filter2D(img->clone(),filsMap,-1,kernel); // works
cv::filter2D(*img,filsMap,-1,kernel); // works
std::cout<<"Is it continuous: " << img->isContinuous() << std::endl;
cv::imshow("image", adjMap);
cv::imshow("false color",falseColorsMap);
cv::imshow("filtered", filsMap);
cv::waitKey(20);
delete img;
}
mem_ifile.close();
return a.exec();
}
最佳答案
所以看起来您正在修改 data
字段而不更新任何其他字段。 (参见 Public Attributes。)具体来说,dataend
, datalimit
和 datastart
属性标识为
helper fields used in locateROI and adjustROI
locateROI
是错误消息中给出的方法。
正确的方法是使用cv::Mat
data* contructor .如文档中所述,
Matrix constructors that take data and step parameters do not allocate matrix data. Instead, they just initialize the matrix header that points to the specified data, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions.
这可确保正确创建所有 header 数据,而无需进行不必要的复制。
另请注意,在使用这些构造函数时,您应该清理自己的数据:
The external data is not automatically deallocated, so you should take care of it.
关于c++ - 为什么使用 cv::Mat (opencv) 更改指向数据的指针对 cv::filter2D 有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594288/
我正在尝试从我的系统中完全删除 opencv。我试图学习 ROS,而在教程中我遇到了一个问题。创建空工作区后,我调用catkin_make 它给出了一个常见错误,我在 answers.ros 中搜索并
我在尝试逐步转移对warpAffine的调用时遇到崩溃(不是异常): void rotateImage( const Mat& source, double degree, Mat& output )
如何处理opencv gpu异常?是否有用于opencvgpu异常处理的特定错误代码集api? 我尝试了很多搜索,但只有1个错误代码,即CV_GpuNotSupported。 请帮帮我。 最佳答案 虽
笔记 我是 OpenCV(或计算机视觉)的新手,所以告诉我搜索查询会很有帮助! 我想问什么 我想编写一个从图片中提取名片的程序。 我能够提取粗略的轮廓,但反射光会变成噪点,我无法提取准确的轮廓。请告诉
我想根据像素的某个阈值将Mono16类型的Mat转换为二进制图像。我尝试使用以下内容: 阈值(img,ret,0.1,1,CV_THRESH_BINARY); 尝试编译时,出现make错误,提示: 错
我对使用GPU加速的OpenCV中的卷积函数有疑问。 使用GPU的卷积速度大约快3.5 运行时: convolve(src_32F, kernel, cresult, false, cbuffer);
我正在尝试使用非对称圆圈网格执行相机校准。 我通常找不到适合CirclesGridFinder的文档,尤其是findHoles()函数的文档。 如果您有关于此功能如何工作以及其参数含义的信息,将不胜感
在计算机上绘图和在 OpenCV 的投影仪上投影之间有什么区别吗? 一种选择是投影显示所有内容的计算机屏幕。但也许也有这样的选择,即在投影仪上精确地绘制和投影图像,仅使用计算机作为计算机器。如果我能做
我将Processing(processing.org)用于需要人脸跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。 import hyperm
我有下面的代码: // Image Processing.cpp : Defines the entry point for the console application. // //Save
我正在为某些项目使用opencv。并有应解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我
我正在尝试使用以下命令创建级联分类器: haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -n
我试图使用OpenCV检测黑色图像中一组形状的颜色,为此我使用了Canny检测。但是,颜色输出总是返回为黑色。 std::vector > Asteroids::DetectPoints(const
我正在尝试使用OpenCv 2.4.5从边缘查找渐变方向,但是我在使用cvSobel()时遇到问题,以下是错误消息和我的代码。我在某处读到它可能是由于浮点(??)之间的转换,但我不知道如何解决它。有帮
我正在尝试构建循环关闭算法,但是在开始开发之前,我想测试哪种功能描述符在真实数据集上效果更好。 我有两个在两个方向拍摄的走廊图像,一个进入房间,另一个离开同一个房间。因此它们代表相同的场景,但具有2个
有没有一种方法可以比较直方图,但例如要排除白色,因此白色不会影响比较。 最佳答案 白色像素有 饱和度 , S = 0 .因此,在创建直方图时很容易从计数中删除白色像素。请执行下列操作: 从 BGR 转
就像本主题的标题一样,如何在OpenCV中确定图像的特定像素(灰度或彩色)是否饱和(例如,亮度过高)? 先感谢您。 最佳答案 根据定义,饱和像素是指与强度(即灰度值或颜色分量之一)等于255相关联的像
我是OpenCV的新用户,正在从事大学项目。程序会获取输入图像,对其进行综合模糊处理,然后对其进行模糊处理。当对合成模糊图像进行反卷积时,会生成边界伪像,因为...好吧,到目前为止,我还没有实现边界条
我想知道OpenCV是haar特征还是lbp是在多尺度搜索过程中缩放图像还是像论文中提到的那样缩放特征本身? 编辑:事实证明,检测器可以缩放图像,而不是功能。有人知道为什么吗?通过缩放功能可以更快。
我在openCv中使用SVM.train命令(已定义了适当的参数)。接下来,我要使用我的算法进行分类,而不是使用svm.predict。 可能吗?我可以访问训练时生成的支持 vector 吗?如果是这
我是一名优秀的程序员,十分优秀!