C++PythonC# 三语言OpenCV从零开发(3):图像读取和显示

news2024/9/21 18:33:38

文章目录

  • 相关链接
  • 前言
  • Mat是什么
  • 读取图片
    • C++
    • C#
    • Python
  • 灰度处理
    • C++
    • CSharp
    • Python
  • 打印图像信息
    • C++
    • Csharp
    • Python
  • 总结

相关链接

C++&Python&Csharp in OpenCV 专栏

【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)

OpenCV4 C++ 快速入门视频30讲 - 系列合集

OpenCV4 C++ 课程笔记

前言

在上一章纠结过教程的选择之后,还是觉得老老实实从零开始学OpenCV,从OpenCV C++视频教程开始。

这里确保你已经拥有了三语言环境。而且用于CSharp的代码和C++的代码差不多,所以我会按照C++,CSharp,Python的顺序写代码

C++&Python&C# 三语言OpenCV从零开发(1):环境配置

Mat是什么

Mat - 基本图像容器

OpenCV2:Mat属性type,depth,step

Mat是图像的基本容器,将图像信息转化为数字信息,MAT本质上是一个矩阵。

图像
三原色
红色通道
....
绿色通道
...
蓝色通道
黑白图像
像素点
0-255代表亮度

读取图片

我们试试读取图片
在这里插入图片描述

C++

#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main()
{
    //注意,文件的路径必须是反斜杠/
    Mat src = imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png");
    //显示图片
    imshow("C++ Png", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

在这里插入图片描述

C#

在这里插入图片描述

 internal class Program
 {
     static void Main(string[] args)
     {

         Mat src = Cv2.ImRead("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png");
         //显示图片
         Cv2.ImShow("CSharp", src);
         Cv2.WaitKey(0);
         Cv2.DestroyAllWindows();
     }
 }

在这里插入图片描述

Python

Python和C++最大的区别就是少了一个变量的命名

在这里插入图片描述

import cv2
# python中需要np来辅助
import numpy as np

src = cv2.imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png")
cv2.imshow("Python",src)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

灰度处理

OpenCV 提供了读取灰度图像的接口

  • CV2.IMREAD_COLOR:彩色图像
  • CV2.IMREAD_GRAYSCALE:灰度图像
    在这里插入图片描述

C++

#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main()
{
    //注意,文件的路径必须是反斜杠/
    //IMREAD_GRAYSCALE灰度读取
    Mat src = imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",IMREAD_GRAYSCALE);
    //显示图片
    imshow("C++", src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

在这里插入图片描述

CSharp

using OpenCvSharp;

namespace HelloOpenCV
{
    internal class Program
    {
        static void Main(string[] args)
        {

            // 由于C# 有枚举类型,命名更加舒服
            Mat src = Cv2.ImRead("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",ImreadModes.Grayscale);
            //显示图片
            Cv2.ImShow("CSharp", src);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

在这里插入图片描述

Python

import cv2
# python中需要np来辅助
import numpy as np

# IMREAD_GRAYSCALE,灰度读取
src = cv2.imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",cv2.IMREAD_GRAYSCALE)
cv2.imshow("Python",src)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

打印图像信息

C++

#include <opencv2/opencv.hpp>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main()
{
    //注意,文件的路径必须是反斜杠/
    //IMREAD_GRAYSCALE灰度读取
    Mat src = imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",IMREAD_GRAYSCALE);
    
    
    //显示图片
    imshow("C++", src);
    cout << endl;
    //打印图像信息
    cout << "图像的行数为: " << src.rows << endl;  //获取图像的高度,行数;
    cout << "图像的列数为: " << src.cols << endl;  //获取图像的宽度,列数;
    cout << "图像的通道数为: " << src.channels() << endl;  //获取图像的通道数,彩色图=3,灰度图=1;
    cout << "图像的尺寸为: " << src.size << endl;  //获取图像的尺寸,行*列;
    waitKey(0);
    destroyAllWindows();
    return 0;
}

在这里插入图片描述

Csharp

一般来说,只要C++跑通了,C# 的代码大差不差

using OpenCvSharp;

namespace HelloOpenCV
{
    internal class Program
    {
        static void Main(string[] args)
        {

            // 由于C# 有枚举类型,命名更加舒服
            Mat src = Cv2.ImRead("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",ImreadModes.Grayscale);
            Console.WriteLine($"图像的行数为:{src.Rows}");
            Console.WriteLine($"图像的列数为:{src.Cols}");
            Console.WriteLine($"图像的通道数为:{src.Channels()}");
            Console.WriteLine($"图像的尺寸为:{src.Size()}");
            //显示图片
            Cv2.ImShow("CSharp", src);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

在这里插入图片描述

Python

import cv2
# python中需要np来辅助
import numpy as np

# IMREAD_GRAYSCALE,灰度读取
src = cv2.imread("D:/workSpace/OpenCV/HellOpenCV/Resources/OpenCV.png",cv2.IMREAD_GRAYSCALE)

# 打印图片信息
# Python将其信息统一放在了shape里面,如果是单通道,通道个数直接没有
print('行,列,通道',src.shape)
print('type:',src.dtype)

# print(str.shape)
cv2.imshow("Python",src)

cv2.waitKey(0)
cv2.destroyAllWindows()

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

总结

如果说C++ 版本是原版的话。那么

  • C++和Python:Python少了变量的声明,算子基本一致
  • C++和C#:除非命名方式,C#为大驼峰,其它基本完全一致

我感觉我的学习的路子应该是对的,毕竟是新手,三个语言的基础的算子还是都要了解一下的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目上线存在的缓存问题以及存在的debugger和console.log等问题

下载uglifyjs-webpack-plugin插件 在vue.config文件中进行配置 publicPath: process.env.NODE_ENV production ? ./ : /,outputDir: n-sim-ipc-manage-build,productionSourceMap: false,configureWebpack: config > {//打包文件增加hashconfig.output.filename js/[nam…

微电网优化MATLAB:基于麻雀搜索算法SSA的微电网优化调度(提供MATLAB代码)

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、麻雀搜索算法简介 麻雀搜索算法 (Sparrow Search Algorithm, SSA) 是一种新型的群智能优化算法&#xff0c;于2020…

博达V900远程透传模块与台达PLC远程上下载程序,远程在线调试程序

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台台达PLC及其编程软件WPLSoft一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff09; …

利用Pytest插件pytest-asyncio实现异步代码测试

在现代异步编程的时代,Python中的 pytest-asyncio 插件为我们提供了在异步代码中进行测试的强大工具。本文将深入介绍 `pytest-asyncio` 插件的基本用法和实际案例,助你更好地理解和运用异步测试。 什么是pytest-asyncio? pytest-asyncio 是Pytest的一个插件,它为异步代码…

免费的几个站群更新软件【2024】

在网站运营的过程中&#xff0c;及时更新和维护是保持网站活力和吸引用户的关键。站群更新软件成为了许多站长的首选&#xff0c;能够帮助批量管理网站、自动更新原创文章&#xff0c;并通过主动推送服务向各大搜索引擎提交信息。本文将专心分享四款卓越的站群更新软件&#xf…

上门按摩系统的开发对于按摩行业有哪些意义

随着科技的迅猛发展&#xff0c;人们的生活水平逐渐提高&#xff0c;对健康与舒适的需求也日益增强。作为古老而又充满现代感的保健方式&#xff0c;按摩已受到广大民众的喜爱与接纳。然而&#xff0c;传统的按摩店往往需要顾客亲自上门&#xff0c;这对于忙碌的上班族或行动不…

按照要求完成如下DQL语句编写

题目来源于黑马MySQL 创建表格&#xff1a; CREATE TABLE TB_EMPLOYEE(ID INT COMMENT 编号,WORK_NO VARCHAR(10) COMMENT 工号,NAME VARCHAR(10) COMMENT 姓名,GENDER CHAR COMMENT 性别,AGE TINYINT UNSIGNED COMMENT 年龄,ID_CARD CHAR(18) COMMENT 身…

前端基础知识:html表格

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title> html表格</title> </head> <style&…

第五篇:其他窗口部件 QAbstractButton

QAbstractButton QAbstractButton 类是按钮部件的抽象基类&#xff0c;提供了按钮的通用功能。它的子类包括标准按钮 QPushButton、工具按钮 QToolButton、复选框 QCheckBox和单选按钮 QRadioButton 等。 QPushButton QPushButton 提供了创建交互按钮的基本功能。它可以包含…

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

J4 - ResNet与DenseNet结合

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境模型设计模型效果展示总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习框架: Pytorch2.0.0cu118显卡&#xff1a;GT…

【JavaScript】日程管理系统 页面案例开发

文章目录 一、登录页及校验二、注册页及校验 一、登录页及校验 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>日程管理登录</title><style>.ht {text-align: center;color: cadetblue;f…

商务与经济统计:中英文转换

数据分析基础中英文转换 Chap 1 数据与统计资料 Data and Statistics 1.2 数据 Data 数据集 Data Sets 个体 Element 变量 Variables 观测值 Observations 测量尺度 Scales of Measurement&#xff1a; 名义尺度 Nominal Scale 顺序尺度 Ordinal Scale 区间尺度 Interval…

数据结构之set类

set类 set 是集合类。这个类很特别&#xff0c;它是唯一坚决追求“特立独行”的数据类型。在这里&#xff0c;你没办法找到两个一样的值&#xff0c;即使强硬赋予&#xff0c;它也会强硬剔除&#xff0c;也就是去重&#xff0c;一个非常实用的技能&#xff0c;这也是 set 类存…

Web自动化之显式等待与隐式等待

等待就是当运行代码时&#xff0c;如果页面的渲染速度跟不上代码的运行速度&#xff0c;就需要人为的去限制代码执行的速度。 在做 Web 自动化时&#xff0c;一般要等待页面元素加载完成后&#xff0c;才能执行操作&#xff0c;否则会报找不到元素等各种错误&#xff0c;这样就…

软件测试基础知识整理(详细版)收藏这篇足矣

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

后面的输入框与前面的联动,输入框只能输入正数(不用正则)

概要 提示&#xff1a;这里可以描述概要 前面的输入框是发票金额&#xff0c;后面的输入框是累计发票金额&#xff08;含本次&#xff09;--含本次就代表后倾请求的接口的数据&#xff08;不是保存后返显的-因为保存后返显的是含本次&#xff09;是不含本次的所以在输入发票金…

ACM题解Day1|1.Accurate Movement ,2.Help the Support Lady, 3.Absolute Game

1.Accurate Movement 思路 : 本题为模拟题主要是模拟方块的移动,其中 以两木块的最右端做为记录点. 先挪动a, 每次a块只能挪到和b块相同的位置, b块每次最多挪动(b-a).为什么因为有限制挡板然后俩木块要不能同时移动只能移动一一个 #include<bits/stdc.h> using namespac…

网页设计(九)JavaScript基础应用

一、网页中文字的字号选择性改变 单击前初始状态页面 单击“中”链接后页面 文字素材&#xff1a;   JavaScript是一种能让你的网页更加生动活泼的程式语言&#xff0c;也是目前网页中设计中最容易学又最方便的语言。你可以利用JavaScript轻易的做出亲切的欢迎讯息、漂亮的…

Linux系统安装NFS服务器

NFS是一种网络文件系统&#xff0c;英文全称Network File System&#xff0c;通过NFS可以让不同的主机系统之间共享文件或目录。通过NFS&#xff0c;用户可以直接在本地NFS客户端读写NFS服务端上的文件&#xff0c;是非常好的共享存储工具。本篇文章将介绍如何在CentOS7上安装N…