opencv c++ Mat CUDA的编译与使用

QT6与OpenCV 4.10环境搭建:ABI对齐、CMake协同与跨平台实战 QT6和OpenCV是现代C++视觉应用开发的核心技术栈,其协同本质在于ABI兼容性、C++标准统一与运行时依赖链的精确控制。QT6采用RHI渲染架构并强制Premultiplied Alpha图像格式,而OpenCV 4.10的cv::Mat需通过cv::toQImage等专用转换函数桥接,否则将引发颜色错位或崩溃;二者在C++17标准、std::string内存布局及CUDA上下文初始化上深度耦合。技术价值体现在实时视频流低延迟显示、DNN模型GPU加速推理与跨平台(x86_64/Jetson/WSL2 阅读详情

Mat

构造函数

cv::Mat img ; //默认 定义了一个Mat
img = cv::imread("image.jpg");//除了直接读取,还有通过大小构造等

cv::Mat img = cv::imread("image.png", IMREAD_GRAYSCALE);
cv::Mat img_novel = img;

转换 Mat::convertTo(Mat& m, int rtype, double alpha=1, double beta=0)

转到数组

// https://www.cnblogs.com/xiaoxiaoyibu/p/9491858.html#
//动态创建二维数组,row行col列
    int **La = new int *[row];
    for (int i = 0; i < row; i ++){
        La[i] = new int[col];
    }
    // 循环二维数组和mat,并将mat对应值赋给二维数组对应值,
    for (int i = 0; i < row; i ++){
        for (int j = 0; j < col; j ++){
            La[i][j] = mat.at<uchar>(i, j);
        }
    }
    // 释放分配空间 (直接创建在栈上double La[row][col];就不用delete了)
    for (int i = 0; i < row; i ++){
        delete []La[i];
    }
    delete [] La;

转到std::vector(注:这个例子将二维图像.reshape(0, 1))

//https://book.mynavi.jp/support/pc/opencv2/c3/opencv_mat.html#cv-vec
#include <iostream>
#include <opencv2/core/core.hpp>

#define OPENCV_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#define OPENCV_VERSION_CODE OPENCV_VERSION(CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION)

int
main(int argc, char *argv[])
{
   cv::Mat m1 = (cv::Mat_<double>(3,3) << 1, 2, 0, 3, 1, 4, 1, 2, 1);
   std::vector<double> v1;

   // Mat -> vector
   m1 = m1.reshape(0, 1); // 1行の行列に変形
#if OPENCV_VERSION_CODE<OPENCV_VERSION(2,3,0)
   m1.copyTo<double>(v1); // データをコピー
#else
   m1.copyTo(v1); // データをコピー
#endif

   std::cout << "m1=" << m1 << std::endl << std::endl;
   for(std::vector<double>::iterator it=v1.begin(); it!=v1.end(); ++it)
     std::cout << *it << ", ";
   std::cout << std::endl;
   
   // vector -> Mat
   cv::Mat m2(v1); // データを共有
   cv::Mat m3(v1, true); // データをコピー
}
std::vector<uchar> array;
if (mat.isContinuous()) {
  // array.assign(mat.datastart, mat.dataend); // <- has problems for sub-matrix like mat = big_mat.row(i)
  array.assign(mat.data, mat.data + mat.total()*mat.channels());
} else {
  for (int i = 0; i < mat.rows; ++i) {
    array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i)+mat.cols*mat.channels());
  }
}

操作

比如:

cv::Mat中最值和均值的求解

在这里插入图片描述

保存mat为图片

		vector<int> compression_params;//可选参数
		compression_params.push_back(IMWRITE_PNG_COMPRESSION); //PNG格式图像压缩标志
		compression_params.push_back(9); //设置最高压缩质量
		bool result = imwrite("alpha.png", _frame2, compression_params);

制作掩膜图像

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>
#include <opencv2/highgui/highgui_c.h>//https://blog.youkuaiyun.com/weixin_44312186/article/details/89000922
using namespace cv;
using namespace std;

void colorReduce(Mat& image, int div)// 这里使用了Mat_instance.at<typename>(i,j) https://www.cnblogs.com/ybqjymy/p/15935894.html
{
	for (int i = 0; i<image.rows; i++)
	{
		for (int j = 0; j<image.cols; j++)
		{
			if (image.at<Vec3b>(i, j)[0] - 0 != 0) {
				image.at<Vec3b>(i, j)[0] = 255;
				image.at<Vec3b>(i, j)[1] = 255;
				image.at<Vec3b>(i, j)[2] = 255;
			}
			//cout<< image.at<Vec3b>(i, j)[0]-0 << endl;//灰度图像元素类型为<uchar>, 彩色图像元素类型为<cv::Vec3b>
		}
	}

	bool result = imwrite("hahaah.png", image);
}

int main(int argc, char** argv) {
	Mat src = imread("C:/Users/admin/Desktop/mask.jpg"); 
	colorReduce(src, 3);
	
	waitKey(0);
	destroyAllWindows();
	return 0;
}

Mat矩阵相乘相关

一个掩膜的例子:
	Mat A = imread("C:/Users/admin/Pictures/mask.jpg");
	Mat B = imread("C:/Users/admin/Pictures/fm.png");
	Mat C = A.mul(B);
	imshow("输入窗口", C);

C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解

split(const Mat &src,//输入图像 Mat* mbegin//输出图像的数组)

C++ opencv之图像直方图(calcHist)

绘制

  • 点
cv::Point   CvPoint:表示一个坐标为整数的二维点,是一个包含integer类型成员x和y的简单结构体。
cv::scalar   表示四个元素地向量 Scalar(a,b,c) ;//a =blue,b=green,c=red表示RGB的三个通道
  • 简单几何
cv::line 线
cv::rectangle 矩形
cv::circle ⚪

CUDA编译

需要有GPU硬件+cudatoolkit+cudnn

在这里插入图片描述

需要的源代码 opencv 编译好的build和source(用source部分) + opencv扩展模块的代码

  • opencv扩展模块
    在这里插入图片描述

用Cmake编译一下源码,当然官方有编译的教程(并且还有参数细节):

  • 在cmake-gui,先选择源码与目标路径

在这里插入图片描述

  • config选项

在这里插入图片描述

  • 设置:OPENCV_EXTRA_MODULES_PATH

在这里插入图片描述

  • 勾选与cuda有关的

在这里插入图片描述

  • 再次点击config

在这里插入图片描述

  • 好多这个错误
=======================================================================
  Couldn't download files from the Internet.
  Please check the Internet access on this host.
=======================================================================

CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
  IPPICV: Download failed: 6;"Couldn't resolve host name"

  For details please refer to the download log file:

  C:/Users/admin/Documents/Visual Studio
  2015/Projects/opencv-4.6.0-vc14_vc15/opencv/build/CMakeDownloadLog.txt

Call Stack (most recent call first):
  3rdparty/ippicv/ippicv.cmake:37 (ocv_download)
  cmake/OpenCVFindIPP.cmake:259 (download_ippicv)
  cmake/OpenCVFindLibsPerf.cmake:12 (include)
  CMakeLists.txt:733 (include)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 然后下边的INSTALL生成

在这里插入图片描述

  • C:\Users\admin\Documents\Visual Studio 2015\Projects\opencv-4.6.0-vc14_vc15\opencv\build\install
  • 就可以将以下bin加到环境变量中了

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 将C:\Users\admin\Documents\Visual Studio 2015\Projects\opencv-4.6.0-vc14_vc15\opencv\build\install\x64\vc14\bin加到path(或者修改项目属性中,配置属性–》链接器–>常规–》附加库目录 中加上xxx.lib所在目录。)
    在这里插入图片描述

添加链接描述

简单使用

GpuMat cv::gpu::GpuMat(在Python是cv2.cuda_GpuMat)

upload+download()

#include <opencv2/highgui.hpp>
#include <opencv2/cudaimgproc.hpp>
 
cv::Mat img = cv::imread("image.png", IMREAD_GRAYSCALE);
cv::cuda::GpuMat dst, src;
src.upload(img);
 
cv::Ptr<cv::cuda::CLAHE> ptr_clahe = cv::cuda::createCLAHE(5.0, cv::Size(8, 8));
ptr_clahe->apply(src, dst);
 
cv::Mat result;
dst.download(result);
 
cv::imshow("result", result);
cv::waitKey();
# python 实现
img = cv2.imread("image.png", cv2.IMREAD_GRAYSCALE)
src = cv2.cuda_GpuMat()
src.upload(img)
 
clahe = cv2.cuda.createCLAHE(clipLimit=5.0, tileGridSize=(8, 8))# 使用对比度受限自适应直方图均衡化来均衡灰度图像的直方图。  https://docs.opencv.org/3.4/db/d79/classcv_1_1cuda_1_1CLAHE.html
dst = clahe.apply(src, cv2.cuda_Stream.Null())# 使用对比度受限自适应直方图均衡化来均衡灰度图像的直方图 https://docs.opencv.org/4.x/d6/db6/classcv_1_1CLAHE.html
 
result = dst.download()
 
cv2.imshow("result", result)
cv2.waitKey(0)

使用多GPU 略

打开视频流(这没有用到cuda)

// init video capture with video
VideoCapture capture(videoFileName);
if (!capture.isOpened())
{
    // error in opening the video file
    cout << "Unable to open file!" << endl;
    return;
}
 
// get default video FPS
double fps = capture.get(CAP_PROP_FPS);
 
// get total number of video frames
int num_frames = int(capture.get(CAP_PROP_FRAME_COUNT));
  • python实现
# init video capture with video
cap = cv2.VideoCapture(video)
 
# get default video FPS
fps = cap.get(cv2.CAP_PROP_FPS)
 
# get total number of video frames
num_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

读取视频(这里我跳过了源文章地大段基本c++方法地解释)

  • 请注意,我们使用相同的 CPU 函数来读取和调整大小,但将结果上传到cv::cuda::GpuMat (cuda_GpuMat)实例:
// resize frame
cv::resize(frame, frame, Size(960, 540), 0, 0, INTER_LINEAR);
 
// convert to gray
cv::cvtColor(frame, previous_frame, COLOR_BGR2GRAY);
 
// upload pre-processed frame to GPU
cv::cuda::GpuMat gpu_previous;
gpu_previous.upload(previous_frame);
 
// declare cpu outputs for optical flow
cv::Mat hsv[3], angle, bgr;
 
// cv::cuda::GpuMat声明  declare gpu outputs for optical flow
cv::cuda::GpuMat gpu_magnitude, gpu_normalized_magnitude, gpu_angle;
cv::cuda::GpuMat gpu_hsv[3], gpu_merged_hsv, gpu_hsv_8u, gpu_bgr;
 
// set saturation to 1
hsv[1] = cv::Mat::ones(frame.size(), CV_32F);
gpu_hsv[1].upload(hsv[1]);
  • python实现
# proceed if frame reading was successful
if ret:
    # resize frame
    frame = cv2.resize(previous_frame, (960, 540))
 
    # upload resized frame to GPU  --- 多了这一段
    gpu_frame = cv2.cuda_GpuMat()
    gpu_frame.upload(frame)
 
    # convert to gray  ---- 没变
    previous_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # upload pre-processed frame to GPU
    gpu_previous = cv2.cuda_GpuMat()
    gpu_previous.upload(previous_frame)
 
    # create gpu_hsv output for optical flow  ----- hsv = np.zeros_like(frame, np.float32)
    gpu_hsv = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC3)
    gpu_hsv_8u = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_8UC3)
 
    gpu_h = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1)
    gpu_s = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1)
    gpu_v = cv2.cuda_GpuMat(gpu_frame.size(), cv2.CV_32FC1)
 
    # set saturation to 1   ----  hsv[..., 1] = 1.0
    gpu_s.upload(np.ones_like(previous_frame, np.float32))

读取视频帧

while (true)//我删除了计时部分
{

    // capture frame-by-frame
    capture >> frame;if (frame.empty())break;
 
    // 增加了上传
    cv::cuda::GpuMat gpu_frame;  gpu_frame.upload(frame);
 
    // resize frame
    cv::cuda::resize(gpu_frame, gpu_frame, Size(960, 540), 0, 0, INTER_LINEAR);//类似 cv::resize(frame, frame, Size(960, 540), 0, 0, INTER_LINEAR);
 
    // 这里也类似cv::Mat换成 cv::cuda::GpuMat,cv::cvtColor换成cv::cuda::cvtColor
    cv::cuda::GpuMat gpu_current;
    cv::cuda::cvtColor(gpu_frame, gpu_current, COLOR_BGR2GRAY);

计算密集光流

// calculate optical flow
cv::Mat flow;
calcOpticalFlowFarneback(previous_frame, current_frame, flow, 0.5, 5, 15, 3, 5, 1.2, 0);

// create optical flow instance
Ptr<cuda::FarnebackOpticalFlow> ptr_calc = cuda::FarnebackOpticalFlow::create(5, 0.5, false, 15, 3, 5, 1.2, 0);
// calculate optical flow
cv::cuda::GpuMat gpu_flow;
ptr_calc->calc(gpu_previous, gpu_current, gpu_flow);

可视化前处理

// start post-process timer
auto start_post_time = high_resolution_clock::now();
 
// split the output flow into 2 vectors
cv::Mat flow_xy[2], flow_x, flow_y;
split(flow, flow_xy);
 
// get the result
flow_x = flow_xy[0];
flow_y = flow_xy[1];
 
// convert from cartesian to polar coordinates
cv::cartToPolar(flow_x, flow_y, magnitude, angle, true);
// normalize magnitude from 0 to 1
cv::normalize(magnitude, normalized_magnitude, 0.0, 1.0, NORM_MINMAX);
// get angle of optical flow
angle *= ((1 / 360.0) * (180 / 255.0));
 
// build hsv image
hsv[0] = angle;
hsv[2] = normalized_magnitude;
merge(hsv, 3, merged_hsv);
 
// multiply each pixel value to 255
merged_hsv.convertTo(hsv_8u, CV_8U, 255);
 
// convert hsv to bgr
cv::cvtColor(hsv_8u, bgr, COLOR_HSV2BGR);
 
// update previous_frame value
previous_frame = current_frame;
// start post-process timer
auto start_post_time = high_resolution_clock::now();
 
// split the output flow into 2 vectors
cv::cuda::GpuMat gpu_flow_xy[2];
cv::cuda::split(gpu_flow, gpu_flow_xy);
 
// convert from cartesian to polar coordinates
cv::cuda::cartToPolar(gpu_flow_xy[0], gpu_flow_xy[1], gpu_magnitude, gpu_angle, true);
 
// normalize magnitude from 0 to 1
cv::cuda::normalize(gpu_magnitude, gpu_normalized_magnitude, 0.0, 1.0, NORM_MINMAX, -1);
 
// get angle of optical flow
gpu_angle.download(angle);
angle *= ((1 / 360.0) * (180 / 255.0));
 
// build hsv image
gpu_hsv[0].upload(angle);
gpu_hsv[2] = gpu_normalized_magnitude;
cv::cuda::merge(gpu_hsv, 3, gpu_merged_hsv);
 
// multiply each pixel value to 255
gpu_merged_hsv.cv::cuda::GpuMat::convertTo(gpu_hsv_8u, CV_8U, 255.0);
 
// convert hsv to bgr
cv::cuda::cvtColor(gpu_hsv_8u, gpu_bgr, COLOR_HSV2BGR);
 
// send original frame from GPU back to CPU
gpu_frame.download(frame);
 
// send result from GPU back to CPU !!!!!!
gpu_bgr.download(bgr);
 
// update previous_frame value
gpu_previous = gpu_current;

可视化(不变)

// visualization
imshow("original", frame);
imshow("result", bgr);
int keyboard = waitKey(1);
if (keyboard == 27)
    break;

CG

在这里插入图片描述
在这里插入图片描述

learnopencv

添加链接描述
https://github.com/spmallick/learnopencv/blob/master/README.md

注:直接选中额外模块的源代码是无法编译的

在这里插入图片描述

还有直接建议复制源码过去的Pasted the modules I want from opencv_contrib into opencv/modules.

在这里插入图片描述

C++与OpenCV目标检测毫秒级优化:从内存管理到GPU加速的实战指南 在计算机视觉与高性能计算领域,性能优化是提升应用实时性与效率的核心。其原理在于通过精细控制计算资源与数据流,减少不必要的开销。这项技术的价值在于能将算法响应时间压缩至毫秒甚至微秒级,对于安防监控、工业质检和自动驾驶等对延迟极其敏感的实时系统至关重要。应用场景广泛覆盖从边缘设备到服务器端的各类视觉任务。本文聚焦于利用C++与OpenCV实现目标检测流水线的极致优化,深入剖析了内存管理、SIMD指令集、并行计算等关键热词,并系统介绍了如何通过避免数据拷贝、利用GPU加速以及优化编译链接策略,将深度学习模型的推理 阅读详情

相关推荐

从源码编译OpenCV:C++项目定制化集成与性能优化指南

在C++项目开发中,第三方库的集成与优化是提升工程化水平的关键环节。计算机视觉库OpenCV作为行业标准,其预编译版本虽便于快速上手,但在跨平台部署、性能调优和功能定制等场景下往往存在局限。通过源码编译,开发者可以深入理解库的构建体系,实现对模块的精确裁剪和针对特定硬件(如CUDA、NEON)的深度优化。这一过程涉及CMake构建工具链的配置、依赖库管理以及编译选项的精细调控,最终生成一个为项目量身定制的高效版本。掌握从源码编译OpenCV的技能,不仅能解决预编译包导致的程序臃肿问题,还能为嵌入式设备或高性

weixin_34252686的博客 451

【opencv】【GPU】windows10下opencv4.8.0-cuda C++版本源码编译教程

【opencv】【GPU】windows10下opencv4.8.0-cuda C++版本源码编译教程

yangyu0515的博客 1万+

OpenCV中的CUDA模块编程详解

在计算机视觉和图像处理领域,OpenCV是一个非常流行的开源库,它提供了丰富的函数和算法来处理图像和视频数据。为了加速图像处理任务,OpenCV还提供了一个CUDA模块,该模块利用了NVIDIA的CUDA平台和GPU(图形处理器)进行并行计算。本文将详细介绍OpenCV中的CUDA模块编程,并提供相应的源代码示例。通过使用CUDA模块,我们可以利用GPU的并行计算能力,加速图像处理任务,从而实现更高的性能。通过使用OpenCV中的CUDA模块,我们可以利用GPU的并行计算能力加速图像处理和计算机视觉任务。

CodeLancerX的博客 716

opencv(C++)GPU、CPU 模板匹配

摘要: 本文主要关注opencv常规版和cuda版的模板匹配算法,网上cuda版的资料不多,这里做个记录,以后用到也好有个参考。 文章目录摘要:1. opencv cuda版配置2. 源码3. 结果4.总结

qq_40622955的博客 7462

基于c++、opencv、cuda、Visual Studio编程

opencv自带的支持的cuda的函数不少,但是不一定够用,而且已经支持的函数有些还不是十分的完善。所以更多的时候还需要编写自己的kernel以进行加速自定义处理。如果基于opencv进行计算机视觉相关开发工作,那么熟悉c++、opencv、cuda编程是避免不了的环节。

学以致用 知行合一 783

使用CUDA加速OpenCV图像处理

OpenCV是一个广泛使用的开源计算机视觉库,而CUDA则是NVIDIA提供的用于并行计算的编程模型和平台。本文将介绍如何使用CUDA和OpenCV结合编程来加速图像处理,并提供相应的源代码示例。接下来,我们将使用C++编写一个简单的图像处理程序,该程序使用CUDA来加速OpenCV的图像处理操作。通过结合使用CUDA和OpenCV,你可以充分利用GPU的并行计算能力来加速图像处理任务。除了模糊滤波之外,你还可以使用CUDA加速其他常见的图像处理操作,如边缘检测、图像缩放、颜色转换等。

WzisTypescript的博客 828

OpenCV 4 入门指南:模块架构、环境搭建与图像处理代码实战

计算机视觉的核心,是把图像视为像素矩阵并对其执行数学运算。滤波、边缘检测、几何变换等操作,本质上都是围绕矩阵与通道的数值计算。OpenCV 将这些运算封装为跨平台函数库,兼顾 C++ 性能与 Python 迭代效率,并逐步强化 DNN 推理能力。它常用于摄像头采集、颜色识别、工业检测和深度学习预处理。理解 Mat 的内存布局、模块分工与版本差异,是避开环境配置和性能陷阱的关键。OpenCV 4 进一步统一语言与模块路线,从源码编译、pip/conda 安装到第一段读写与识别代码,构成一条可复用的图像处理入门

weixin_34347651的博客 344

OpenCV 2.4.11计算机视觉库实战指南

OpenCV 2.4.11 可能不是最新的,但它教会我们的东西,远比版本号重要得多:内存管理是性能的起点;模块化设计是可维护性的保障;API 抽象是扩展性的灵魂;GPU 加速是实时系统的命脉;亲手编译才是掌控全局的关键。在这个动辄“调包”的时代,回头看看这些经典设计,你会发现:真正的技术深度,藏在每一行精心设计的代码里。💻✨所以,别急着追新,先把这辆“老越野车”开明白。等你真正掌握了它的脾气,再去驾驭那些“智能电车”,才会游刃有余。🚀。

weixin_42576410的博客 622

OpenCV 4 入门指南:环境配置、Mat 原理与图像处理实战

OpenCV 是开源计算机视觉与图像处理库,核心是以 Mat 承载图像矩阵,围绕模块化算子完成读写、滤波、颜色空间与特征分析。理解 Mat 的浅拷贝、BGR 排列和类型尺寸,是避免工程报错的关键。它的价值在于把工业检测、目标追踪、人脸识别等高频需求沉淀为可复用函数,尤其适合用 opencv python 快速验证、opencv c++ 部署落地。典型场景包括 opencv 颜色识别、摄像头轮廓分析、基于 STM32 与 OpenCV 的多模式舵机云台目标追踪等。围绕 OpenCV 4 的入门与排错,从环境搭

weixin_33845881的博客 454

ComfyUI的G-Dino模型加载器报错解决方案:从崩溃到重生

遇到G-Dino模型加载器报错不要慌,按照本文的步骤操作,99%的问题都能解决。模型文件正确下载到指定位置segment_anything节点安装完整且无冲突需要补充更多细节或故障排除方法吗?可以随时告诉我。

2301_78150483的博客 4022

CATIA二次开发CAA:(一)开发环境搭建

CATIA+CAA+RADE+VS2012

ysm1987的博客 1万+

Windows下OpenCV环境配置避坑指南

OpenCV作为主流计算机视觉库,在Windows平台因运行时依赖、编译器链、Python ABI及GPU驱动等多重约束,常出现DLL加载失败、摄像头无法打开、CUDA构建报错等问题。其核心原理在于Windows特有的CRT版本对齐机制、MSVC与CUDA工具链的严格兼容要求,以及UAC权限对DLL加载的静默拦截。技术价值体现在规避环境摩擦、提升部署稳定性与跨语言互通效率。典型应用场景包括工业质检、实时目标检测、医疗影像处理及校企联合实训项目。本文聚焦Windows 10/11环境下OpenCV的Pytho

weixin_33154775的博客 184

SAP MIGO屏幕增强的具体实施步骤介绍(SE19:MB_MIGO_BADI) <转载>

1.MIGO抬头屏幕增强具体增强实施步骤1.1.创建存储抬头客制化数据的增强表1.2.创建增强结构1.3.创建函数组ZMM_MIGO1.3.1.定义全局变量1.3.2.创建数据处理函数1.4.创建字屏幕9001屏幕PBOendif.endloop.1.5.实施新BADI增强SE19创建BADI实施双击实施类ZCL_MIGO_EN_01exportingendif.endmethod.endif.endif.exportingendmethod.

qq_55488207的博客 4508

opencv Mat 图像数据元素进行排序

原文:http://blog.youkuaiyun.com/qing101hua/article/details/52817373 sortIdx 函数 对元素进行排序, 返回对应的排序索引 [cpp] view plain copy print? Mat c1 = (Mat_double>(3,3) Mat c2(c1);  sortIdx(c1, c2, SO

qq_28424679的博客 3701

k8s篇之underlay网络和overlay区别

underlay和overlay

小橙子的笔记屋 2142

SAP 销售订单BOM使用场景简介

通常在MTO的生产场景中,我们会根据已创建的SO去展开BOM去驱动生产,如果我们生产地产品BOM是通用性的通常我们用标准BOM的方式就可以实现,但是实际在生产过程中往往不会这样,不同的客户对某些物料的规格就不相同,就会涉及产生不同的BOM,但是该客户的产品又不存在通用性,这个时候就会引入概念就是销售订单BOM,先有销售订单然后根据销售订单+行项目创建BOM。销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定的销售订单或者可以理解为特定的客户创建的BOM。

我小时候很黑的博客 4216

Ubuntu opencv3.4.1 编译之编译错误: 'cuda_compile_generated_gpu_mat.cu.o'

错误提示: cuda_compile_generated_gpu_mat.cu.o 可能是gcc版本的问题,外网类似问题, sudo apt install gcc-5 g++-5 cd opencv3.4.1 mkdir build && cd build rm -rf * cmake -D BUILD_EXAMPLES=ON -D CMAKE_INSTALL_PREFIX=/u...

P0ny的博客 3461

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

windows+bazel+tensorflow-v1.12.0(GPU)编译生成dll与lib

目录 0.最终环境 1.安装vs2015、cuda9.0、python3.5+ 2.安装 MSYS2 3.安装 Bazel 4.下载tensorflow-v1.12 5.修改文件配置 6.使用powershell进行配置与编译 7.vs无法解析的外部符号与powershell编译出现无法解析的外部符号错误 8.准备tensorflow的dll、lib、include 8.1...

聿默的博客 1万+

【OpenClaw从入门到精通】第13篇:OpenClaw低代码编排实战:非技术人员也能玩转AI自动化流程(2026新版实测)

本文聚焦OpenClaw 2026版核心升级的低代码编排能力,针对非技术人员的实操需求,从底层逻辑、双环境部署、三类实战案例、避坑指南四个维度展开。详解阿里云集群版(企业级)与汉化本地版(个人调试)的部署步骤,通过基础数据统计、公众号内容生产线、企业级任务调度三个递进式案例,演示可视化拖拽搭建自动化流程的完整过程。全程零代码/低代码操作,配套详细参数配置、执行结果模拟及问题排查方案,帮助销售、运营、自媒体等非技术人员快速掌握自动化工具,将重复工作交给AI,提升核心工作效率。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 615

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7748

OpenCV Mat UMat GpuMat Matx HostMem InputArray等设计哲学

行为模式调用方式适用场景设计目的转发/代理直接调用等的方法。处理所有数组类型都支持的通用操作。抽象与多态:隐藏具体实现,让函数可以处理多种数据类型。直接获取先调用等获取具体引用,再调用该引用的特有方法。处理某个特定数组类型才有的专属操作。灵活性与完整性:不限制开发者使用具体类的全部功能。所以,您的观察是完全正确的。OpenCV 的代理类设计,是一个在高度抽象(为了易用和通用)和完全控制(为了性能和功能完整性)之间取得精妙平衡的典范。

刘杰的博客 1704

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OpenCV 5.x CUDA 模块完全指南:主机端 API 设计、GPU 架构编译与多 GPU 并行方案

OpenCV 的 CUDA 模块是承载 NVIDIA GPU 加速能力的一整套类与函数集合。本文基于仓库中的官方文档 [CUDA Module Introduction](https://link.gitcode.com/i/8f8b9af0e0deb89e34a22773dfee0e91)(OpenCV 5.1.0-dev),系统梳理其设计定位、`WITH_CUDA` 编译启用方式、cubin/

gitblog_00921的博客 962

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OpenCV 4 从安装到选型:模块、Mat与避坑实战

图像处理与计算机视觉的核心,是把图像当作矩阵进行读写、滤波、变换与特征分析。OpenCV 作为经典开源视觉库,以 cv2 模块提供从 imread、cvtColor 到 DNN 推理的底层算子,并通过 Mat 这一头数据分离的矩阵容器实现高效内存共享与 ROI 操作。其价值在于跨平台、免编译开箱即用,且 Apache 2.0 许可对商用友好,广泛用于工业检测、人脸门禁、摄像头颜色识别和轻量模型部署。实际落地时,opencv-python 安装、Anaconda 环境隔离、pip 与 conda 混用、模块缺

weixin_34082854的博客 367

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++DLL与Unity交互的技术总结

C++DLL与Unity交互的技术总结--以光场重聚焦算法为例项目目标具体思路项目技术总结1.光场重聚焦简介2.OpenCV源码编译包含CUDA模块3.如何使用VS编写生成C++DLL?4.Unity C#如何调用C++DLL?5.C#读取.mat文件6.OpenCV C++ Mat图像与Unity Texture的转换7.如何调试被Unity调用的C++DLL? 项目目标  将C++ OpenCV编写的光场重聚焦算法移植到Unity进行显示。 具体思路  最初的思路是将光场重聚焦算法在Unity C#脚本

小M的博客 2122

OpenCV-C++-CUDA-01-基本图像读取及灰度转换

        长时间用着Python和深度学习框架,还是要回到图像处理篇,下面我就要重回图像处理(C++)篇了,以此来记录自己下一阶段的学习历程。         我们知道,一般的OpenCV基本都是基于CPU模块的,所以速度方面受限很大,而如果使用GPU来处理图像的话,性能会非一般的提升。本章主要是记录OpenCV和CUDA结合在C++上的应用,

Daker_Huang的博客 3710
上一篇: opencv光流(密集光流+稀疏光流) cv.calcOpticalFlowPyrLK & cv2.calcOpticalFlowFarneback python与c++实现
下一篇: 【c++ 高性能】:windows上 CUDAtoolkit+cudnn的安装
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值