Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV如何处理Mat作为指针加速的代码?_C++_Opencv_Pointers_Mat - Fatal编程技术网

C++ OpenCV如何处理Mat作为指针加速的代码?

C++ OpenCV如何处理Mat作为指针加速的代码?,c++,opencv,pointers,mat,C++,Opencv,Pointers,Mat,我试图将指针与cv::Mat一起使用,但我不太理解它 当我尝试这个: #包括 #包括 使用名称空间cv; 使用名称空间std; int main() { Mat src=imread(“image.png”); Mat-img; 垫温; img=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0)); temp=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0)); 温度=img(范围(10,20),范围(40,60)); 温

我试图将指针与cv::Mat一起使用,但我不太理解它

当我尝试这个:

#包括
#包括
使用名称空间cv;
使用名称空间std;
int main()
{
Mat src=imread(“image.png”);
Mat-img;
垫温;
img=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0));
temp=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0));
温度=img(范围(10,20),范围(40,60));
温度设置为(255);
imshow(“img”,img);
waitKey();
返回0;
}
它工作正常,没有问题。但是,当我将其更改为:

#包括
#包括
使用名称空间cv;
使用名称空间std;
int main()
{
Mat src=imread(“image.png”);
Mat*img;
材料*温度;
*img=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0));
*temp=Mat(src.rows,src.cols,CV_8UC1,CV::Scalar(0));
温度=img(范围(10,20),范围(40,60));
温度设置为(255);
imshow(“img”)、*img;
waitKey();
返回0;
}
我得到这个错误:

表观调用括号前面的表达式必须具有 (指向-)函数类型的指针

temp=img(范围(10,20),范围(40,60));
错误是:

表达式必须具有类类型

温度设置为(255);
处理Mats作为加速代码指针的一般规则是什么

例如,我知道,在函数参数中,我们使用
&
作为输入垫,使用
*
作为输出垫。但是,在函数中如何定义和使用Mats有一个通用规则吗


请告诉我这个代码是否还有其他错误,因为我是初学者。谢谢大家!

在您发布的示例中,使用指针没有任何好处。在指针示例中,存在许多问题

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat src = imread("image.png");
    Mat* img; // Uninitialized pointer; points to random memory
    Mat* temp; // Uninitialized pointer; points to random memory

    // Undefined behavior: dereferencing an uninitialized pointer
    // You are basically trying to treat some random piece of memory
    // as a cv::Mat and trying to assign another cv::Mat to it.
    *img = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0)); 
    *temp = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));

    // Syntax error: img has type Mat*; you could call the
    // Mat Mat::operator()( Range _rowRange, Range _colRange ) const
    // Like this:
    // *temp = img->operator()(Range(10, 20), Range(40, 60));
    // or like this:
    // *temp = (*img)(Range(10, 20), Range(40, 60));
    // that would work if img and temp were to point to valid cv::Mats
    temp = img(Range(10, 20), Range(40, 60));
    // Syntax error temp has type Mat*
    //  to access a pointers members use -> instead of .
    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; // Uninitialized pointer; points to random memory
    Mat* temp; // Uninitialized pointer; points to random memory

    // Undefined behavior: dereferencing an uninitialized pointer
    // You are basically trying to treat some random piece of memory
    // as a cv::Mat and trying to assign another cv::Mat to it.
    *img = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0)); 
    *temp = Mat(src.rows, src.cols, CV_8UC1, cv::Scalar(0));

    // Syntax error: img has type Mat*; you could call the
    // Mat Mat::operator()( Range _rowRange, Range _colRange ) const
    // Like this:
    // *temp = img->operator()(Range(10, 20), Range(40, 60));
    // or like this:
    // *temp = (*img)(Range(10, 20), Range(40, 60));
    // that would work if img and temp were to point to valid cv::Mats
    temp = img(Range(10, 20), Range(40, 60));
    // Syntax error temp has type Mat*
    //  to access a pointers members use -> instead of .
    temp.setTo(255);

    imshow("img", *img);
    waitKey();
    return 0;
}

另外,您应该避免使用指向cv::Mat的指针,因为它本身已经是一个refcounted智能指针。解释了一些事情。但是我不知道错误是从哪里来的。好吧,您应该避免使用指向cv::Mat的指针,因为它本身已经是一个refcounted智能指针。解释了一些事情。但是我不知道这个错误是从哪里来的。谢谢你的回答。最后一点,你是说,如果 Mat < /Cord>是输出图像,在函数参数中最好使用<代码> Matt*/Cuth>?一般来说,如果C++中有输出参数,可以在使它成为引用或指针之间做出选择。除了语法之外,区别在于引用不能为null,但指针可以为null。因此,如果您想使out参数成为可选参数,那么将其设置为指针通常是有意义的。感谢您提供了非常有用的答案。最后一点,你是说,如果 Mat < /Cord>是输出图像,在函数参数中最好使用<代码> Matt*/Cuth>?一般来说,如果C++中有输出参数,可以在使它成为引用或指针之间做出选择。除了语法之外,区别在于引用不能为null,但指针可以为null。因此,如果您想使out参数成为可选的,那么将其设置为指针通常是有意义的。