在垫子读取期间发生 Segerror ,直到使用 ostream
Segerror occures during mat reading until ostream is used
我有两个CV_32FC1垫flow[0]
,flow[1]
这样生成的
95 cv::gpu::BroxOpticalFlow bof(alpha, gamma, scale_factor, inner_iteratoins, outter_iterations, solver_iterations);
96 bof(gpuFrame[0], gpuFrame[1], gpuFlow[0], gpuFlow[1]);
97
98 cv::Mat flow[2];
99 for(int i=0; i<2; ++i) {
100 gpuFlow[i].download(flow[i]);
101 }
仅当同时注释 115 行和 116 行时,才会在第 117 行发生分段错误。
105 cv::Size flow_size = flow[0].size();
106
107 std::size_t vertices_count = flow_size.width * flow_size.height;
108
109 std::list< int > vertices;
110 for(int j=0; j<flow_size.height; ++j) {
111 const double * x_flow = flow[0].ptr<double>(j);
112 const double * y_flow = flow[1].ptr<double>(j);
113
114 for(int i=0; i<flow_size.width; ++i, ++x_flow, ++y_flow) {
115 //std::cout << i << ' ' << j << std::endl;
116 //std::cout << "|" << std::endl;
117 if(norm(*x_flow, *y_flow) > eps) {
118 vertices.push_back(i + j*flow_size.width);
119 }
120 }
121 }
如果从命令行调用代码,则不返回任何内容。但是,当程序在 gdb 中执行时,会返回段错误代码。当 115 或 116 未注释时,一切都很好。
G++ 版本是 4.9.2。OpenCV 2.4.9 使用 CUDA 编译。使用 C++11 标志。
CV_32FC1
是float
,而不是double
。
改变
const double * x_flow = flow[0].ptr<double>(j);
const double * y_flow = flow[1].ptr<double>(j);
自
const float * x_flow = flow[0].ptr<float>(j);
const float * y_flow = flow[1].ptr<float>(j);
将浮点内存解释为双倍内存意味着您正在读取每个像素的 2 倍内存块数。因此,如果下一个内存块不属于您的程序,您将走出图像内存并出现段错误。
您正在访问*x_flow, *y_flow
上的第 117
行中的元素。
如果你没有得到段错误,那么你"意外"访问了你自己程序的内存,但无论如何你不会从一开始就读取你想要读取的值。
相关文章:
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 将 ostream 包装在类中并模板化<<运算符
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 为什么在返回 ostream 类时使用引用?
- 将标准输出重定向到ostream
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- ostream& operator<< (ostream& (*pf)(ostream&));
- 在垫子读取期间发生 Segerror ,直到使用 ostream