【发布时间】:2019-11-07 11:20:23
【问题描述】:
我正在尝试将指针与 cv::Mat 一起使用,但我不太明白。
当我尝试这个时:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("image.png");
Mat img;
Mat temp;
img = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
temp = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
temp = img(Range(10, 20), Range(40, 60));
temp.setTo(255);
imshow("img", img);
waitKey();
return 0;
}
它有效,没有问题。但是,当我将其更改为:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("image.png");
Mat* img;
Mat* temp;
*img = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
*temp = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
temp = img(Range(10, 20), Range(40, 60));
temp.setTo(255);
imshow("img", *img);
waitKey();
return 0;
}
我收到此错误:
明显调用括号前的表达式必须有 (pointer-to-) 函数类型
在
temp = img(Range(10, 20), Range(40, 60));
和错误:
表达式必须有类类型
在
temp.setTo(255);
将Mats作为指针处理以加速代码的一般规则是什么?
我知道,例如,在函数参数中,我们使用 & 输入 Mats 和 * 输出 Mats。但是在函数内部如何定义和使用 Mats 有一般规则吗?
由于我是初学者,请告诉我此代码是否还有其他问题。谢谢!
【问题讨论】:
-
Afaik 你应该避免使用指向 cv::Mat 的指针,因为它本身已经是一个引用的智能指针。
-
this answer 解释了一些事情。但我不知道错误来自哪里。