c++ - 将八度矩阵转换为 oct 文件中的 cv::Mat
问题描述
我写了一个简单的 Oct 文件来包装 OpenCV 函数。这是我的代码:-
#include <octave/oct.h>
#include <opencv2/imgproc.hpp>
DEFUN_DLD (cornerHarris, args, , "Harris Corner Detector")
{
// Processing arguments
if(args.length()<4){
print_usage();
}
Matrix octInMat = args(0).matrix_value();
int blockSize = args(1).int_value();
int kSize = args(2).int_value();
double k = args(3).double_value();
int borderType = args(4).int_value();
// Dimentions
dim_vector dims = octInMat.dims();
int h = dims.elem(0);
int w = dims.elem(1);
// OpenCV Matrix
cv::Mat cvInMat = cv::Mat::zeros(h,w, CV_8U);
cv::Mat cvOutMat = cv::Mat::zeros(h,w, CV_32FC1);
// Converting Octave Matrix to OpenCV Matrix
for (int r=0;r<h;r++)
{
for(int s=0;s<w;s++)
{
cvInMat.at<int>(r,s) = octInMat(r,s);
}
}
cv::cornerHarris( cvInMat, cvOutMat, blockSize, kSize, k, borderType );
// Converting OpenCV Matrix to Octave Matrix
Matrix octOutMat = Matrix(dim_vector(h,w));
for (int r=0;r<h;r++)
{
for(int s=0;s<w;s++)
{
octOutMat(r,s) = cvOutMat.at<double>(r,s);
}
}
return octave_value(octOutMat);
}
但是当变量的值增加时,我得到了一个分段错误w
。有没有什么捷径可以在不循环的情况下转换矩阵?或者有没有办法解决分段错误?
文件:-
解决方案
我通过在我的代码中逐行注释来解决这个问题。由于类型转换问题,此行发生了此问题。
cvInMat.at<int>(r,s) = octInMat(r,s);
我将其更改如下。
cvInMat.at<uchar>(r,s) = (uchar)octInMat(r,s);
这个答案帮助我解决了这个问题。
推荐阅读
- gitlab - 如何在 Gitlab 上查看文件的所有历史版本?
- ibm-cloud - 在 dropsolve 中带有回调的 docplex
- javascript - 使用地图获取属性是否禁用
- if-statement - 我不想写 60 个 'IF' 命令
- python - TypeError:将形状转换为 TensorShape 时出错:int() 参数必须是字符串或数字,而不是“元组”
- html - 使用 VB.Net 将 Excel 转换为 HTML
- e-commerce - 如何创建 Commerce Repeat Order 链接视图?
- mysql - Laravel 多连接计数
- python - 要锁定并用于运行余额计算的数据框单元格(后续问题)
- go - 与任意切片一起使用的交换实现