假设这里原图数据为matSrc :
copy方法 | 结果 |
---|---|
matA = matSrc | 浅拷贝 |
matB(matSrc ) | 浅拷贝 |
matC = matSrc .clone() | 深拷贝 |
matSrc .copyTo(matD) | 深拷贝 |
测试代码,在拷贝后的图片中加入文字或者叠加图片, 对比原图和拷贝的图片看原图是否改变。这里使用opencv窗口嵌入到Qt窗口中显示:
#include "widget.h"
#include "./ui_widget.h"
#include
#include
Widget::Widget(QWidget* parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
cv::Mat src = cv::imread("C:/Users/003/Desktop/qt6demo/img/20230214134245.png");
#if 1
cv::Mat matA = src;
cv::putText(matA, "MatA", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
//先显示拷贝的图片
showImage("matA", matA, ui->picLabel2);
#elif 0
cv::Mat matB(src);
cv::putText(matB, "MatB", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
//先显示拷贝的图片
showImage("matB", matA, ui->picLabel2);
#elif 0
cv::Mat matC = src.clone();
cv::putText(matC, "MatC", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
//先显示拷贝的图片
showImage("matC", matA, ui->picLabel2);
#else
cv::Mat matD;
src.copyTo(matD);
cv::putText(matD, "MatD", cv::Point(200, 50), 16, 1.0, cv::Scalar(0, 255, 0), 2);
//先显示拷贝的图片
showImage("matD", matA, ui->picLabel2);
#endif
//再显示原图看是否改变
showImage("src", src, ui->picLabel1);
}
Widget::~Widget()
{
delete ui;
}
void Widget::showImage(std::string name, cv::Mat& mat, QLabel* label)
{
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
cv::imshow(name, mat);
HWND hwnd = (HWND)cvGetWindowHandle(name.c_str());
HWND phwnd = GetParent(hwnd);
SetParent(hwnd, (HWND)label->winId());
ShowWindow(phwnd, SW_HIDE);
cv::resizeWindow(name, cv::Size(540, 318));
}
测试结果:在拷贝的图片中加入文字后, 原图也发生了改变,所以这是浅拷贝,data并未全部复制一遍而是只赋值了数据的指针
测试结果:在拷贝的图片中加入文字后, 原图也发生了改变,所以这是浅拷贝,data并未全部复制一遍而是只赋值了数据的指针
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍
测试结果:在拷贝的图片中加入文字后, 原图未发生改变,所以这是深拷贝,data也全部复制了一遍
作者:费码程序猿
欢迎技术交流:QQ:255895056
转载请注明出处,如有不当欢迎指正