尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

OpenCV、EmguCV和OpenCvSharp访问图像耗时测评(附源码)

OpenCV、EmguCV和OpenCvSharp访问图像耗时测评(附源码)
📅 发布时间:2026/6/19 23:51:38

OpenCV、EmguCV和OpenCvSharp访问图像耗时测评(附源码)

背景介绍

EmguCV和OpenCvSharp都是OpenCV在.Net下的封装,常常会听到有人说EmguCV或OpenCvSharp同样的函数比OpenCV函数运行速度慢,到底是不是真的?博主暂时也没有去一一验证,本文主要对比下三者用指针方法读取像素的速度、耗时情况。

对比实验说明

提供2张图片做测试,分辨率分别是3000 x 3835 和 600 x 676:

分别使用OpenCV、EmguCV和OpenCvSharp指针方法来读取修改像素值,并计算所用时间。

测试图与结果图:

【1】OpenCV测试

代码如下:

代码语言:javascript
代码运行次数:0
运行
 
AI代码解释
复制
// Read_Modify_Piexl_Value.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;Mat readPixelNormal(Mat img, Mat thres)
{for (int i = 0; i < thres.rows; i++){for (int j = 0; j < thres.cols; j++){if (thres.at<uchar>(i, j) == 255)img.at<Vec3b>(i, j) = Vec3b(197, 247, 254); //BGR彩色图像素值改变}}return img;
}Mat readPixelFast(Mat img, Mat thres)
{for (int i = 0; i < thres.rows; i++){uchar *ptr = thres.ptr<uchar>(i);uchar *ptrColor = img.ptr<uchar>(i);for (int j = 0; j < thres.cols; j++){if (ptr[j] == 255){ptrColor[j * 3] = 197;ptrColor[j * 3 + 1] = 247;ptrColor[j * 3 + 2] = 254;}}}return img;
}int main()
{Mat img = imread("S.png");Mat gray, thres;cvtColor(img, gray, COLOR_BGR2GRAY);threshold(gray, thres, 0, 255, THRESH_BINARY | THRESH_OTSU);double start = static_cast<double>(getTickCount());//Mat result = readPixelNormal(img, thres);Mat result = readPixelFast(img, thres);double end = static_cast<double>(getTickCount());double useTime = ((double)end - start) / getTickFrequency() * 1000;cout << "use-time = " << useTime << "ms" << endl;imwrite("res.png", result);return 0;
}

测试结果:

3000 x 3835 图像耗时 12ms左右

600 x 676 图像耗时 0.7ms左右

【2】EmguCV测试

代码如下:

代码语言:javascript
代码运行次数:0
运行
 
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;namespace Read_Modify_Pixel
{class Program{static void Main(string[] args){Mat img = CvInvoke.Imread("S.png");Mat gray = new Mat();Mat thres = new Mat();CvInvoke.CvtColor(img, gray, ColorConversion.Bgr2Gray);CvInvoke.Threshold(gray, thres, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);DateTime startTime = DateTime.Now;unsafe{for (int i = 0; i < img.Rows; i++){IntPtr ptr = thres.DataPointer;IntPtr ptrColor = img.DataPointer;byte* data = (byte*)ptr.ToPointer();byte* dataColor = (byte*)ptrColor.ToPointer();for (int j = 0; j < img.Cols; j++){if (data[i * img.Cols + j] == 255){int index = (img.Step * i) + (j * 3);dataColor[index] = 197;dataColor[index + 1] = 247;dataColor[index + 2] = 254;}}}}DateTime stopTime = DateTime.Now;TimeSpan useTime = stopTime - startTime;Console.WriteLine("useTime: {0}ms", useTime.TotalMilliseconds);CvInvoke.Imwrite("res.png", img);}}
}

测试结果:

3000 x 3835 图像耗时 950ms左右

600 x 676 图像耗时 44ms左右

【3】OpenCvSharp测试

代码如下:

代码语言:javascript
代码运行次数:0
运行
 
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using OpenCvSharp;namespace Read_Pixel_Value
{class Program{//指针方法修改像素值static void Main(string[] args){Mat img = Cv2.ImRead("S.png");Mat gray = new Mat();Mat thres = new Mat();Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);Cv2.Threshold(gray, thres, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);DateTime startTime = DateTime.Now;//指针方法修改像素值unsafe{for (int i = 0; i < thres.Rows; i++){IntPtr ptr = thres.Ptr(i);IntPtr ptrColor = img.Ptr(i);for (int j = 0; j < thres.Cols; j++){byte* data = (byte*)ptr.ToPointer();byte* dataColor = (byte*)ptrColor.ToPointer();if (data[j] == 255){dataColor[j * 3] = 197;dataColor[j * 3 + 1] = 247;dataColor[j * 3 + 2] = 254;}}}}DateTime stopTime = DateTime.Now;TimeSpan useTime = stopTime - startTime;Console.WriteLine("useTime: {0}ms", useTime.TotalMilliseconds);Cv2.ImWrite("res.png", img);Console.WriteLine("Done!");}}
}

测试结果:

3000 x 3835 图像耗时 340ms左右

600 x 676 图像耗时 18ms左右

测试结果

由上面测试结果汇总成下表,明显看出C++ OpenCV指针方法访问像素值最快,其次是OpenCvSharp,最慢的则是EmguCV,以上结果仅供参考。

—THE END—

 

 

出处:https://cloud.tencent.com/developer/article/2121762

您的资助是我最大的动力!
金额随意,欢迎来赏!
付款后有任何问题请给我留言。

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。(●'◡'●)

因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!

如果对你有所帮助,赞助一杯咖啡!打           付款后有任何问题请给我留言!!!

本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/19140202

【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!

相关新闻

  • Exp2
  • 2025 年流量计厂家最新推荐排行榜:聚焦国内优质厂商,覆盖电磁涡街等多类型产品,助力企业精准选型避开风险液体质量/金属管浮子/液体涡轮/气体涡轮/旋进漩涡/空气流量计厂家推荐
  • 2025石墨聚苯板源头厂家推荐榜,岩棉板/石墨保温板/EPS泡沫板公司推荐

最新新闻

  • ComfyUI-KJNodes:5步掌握AI工作流效率跃升的核心技术
  • 如何安装BlockParty广告拦截器?iOS与macOS平台的快速上手教程
  • CANN/asc-devkit SIMD bfloat16转fp4x2函数
  • Git状态可视化:深入解析Nicolas Gallagher dotfiles的bash提示符系统
  • TPM架构探秘(三):从可信根到主动免疫——TPM 2.0架构下的可信平台构建实践
  • 为什么选择vscode-remote-try-node?Node.js开发容器的10大优势与实际应用案例

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号