OpenCV:内存位置问题
OpenCV: memory location issue
我刚刚安装了opencv 2.4.10。我使用Visual Studio的免费版本。它编译了opencv命令,我能够在窗口上显示我的计算机相机输入。但是,似乎任何访问 Mat 对象中的值的尝试都会失败。如果我从(例如)开始:
Mat M;
M.create(4, 4, CV_8UC(2));
我可以看到 M 不是空的,而是:
double b = M.at<double>(0, 0);
结果在:在 myOpenCVStudy.exe 中0x75C92F71处未处理的异常:内存位置 0x006AECD4 Microsoft C++异常:std::bad_alloc。
int a = countNonZero(M);
结果在:在myOpenCVStudy.exe中0x75C92F71未处理的异常:Microsoft C++异常:cv::内存位置0x00ADF868的异常。
和:
cout << "M = " << endl << " " << M << endl << endl;
结果在:myOpenCVStudy.exe 中0x734ADE19 (msvcp100.dll) 处未处理的异常: 0xC0000005:访问冲突读取位置0x00000000。
对于第二种情况,我得到"未加载符号"。关于 C:\Windows\SysWoW64\KernelBase.dll.说我需要更改 PDB 和二进制搜索路径(Microsoft符号服务器),它是如何完成的。
感谢您的帮助,
谢谢
亚尔
创建Mat
时,通过将CV_8UC(2)
传递给 create
函数,将类型指定为两个 8 位无符号数据的通道:
M.create(4, 4, CV_8UC(2));
尝试通过强制转换为 double
来访问 8 个字节将导致问题:
double b = M.at<double>(0, 0);
因此,您需要使用适当的结构进行访问,例如 Vec2b
,其中包含两个 8 位字节:
Vec2b b = M.at<Vec2b>(0, 0);
现在,您可以从两个通道中的每一个访问值:
unsigned char uCH1 = b[0];
unsigned char uCH2 = b[1];
countNonZero
崩溃的原因可能是因为根据文档,它期望的是单通道输入,而不是双通道输入。在调试模式下运行应该会产生适当的断言。
如果您确实想要双打的单通道图像,只需在创建时将类型更改为 CV_64F
:
Mat M;
M.create(4, 4, CV_64F);
double b = M.at<double>(0, 0);
int a = countNonZero(M);
您的图像有两个通道,请使用 cv::Vec2b 而不是双通道
cv::Mat M;
M.create(4, 4, CV_8UC(2));
...
cv::Vec2b b = M.at<cv::Vec2b>(0, 0);
尝试以这种方式创建垫子:
cv::Mat M = cv::Mat(2,2, CV_8UC3, Scalar(0,0,255));
- 警告处理为错误这里有什么问题
- 这个返回元素位置的基于循环的函数有什么问题?
- 将文件复制到自定义位置,存在字符串转换问题
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 关于重载 -> 运算符中 const 关键字的特定位置的问题
- 关于引用数组位置的问题
- 恢复Qt窗口大小和位置问题
- 使用 Arduino 将位置编码器值转换为 RPM 时出现问题
- 自旋控制位置问题(Windows)
- C++ OpenGL Glutsphere 位置问题
- TMX问题,在正确位置绘制瓷砖(c++)
- OpenCV:内存位置问题
- 我的字节数组到十六进制字符串转换器有什么问题,或者为什么它在写入文件时会在某个位置后剪切符号?
- 访问冲突写入位置0x00000000.内存集函数问题
- qmessagebox问题,可以't改变其位置
- 写入位置0x00000000时发生访问冲突.指针问题
- COUT只在内存中打印位置的c++问题
- 如何处理随机访问ifstream使用?-位置/偏移量/尺寸问题
- 我的函数更新恒星附近行星的位置有什么问题?
- boost::program_options和位置参数的问题