文章目录
- 相关链接
- 前言
- 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#为大驼峰,其它基本完全一致
我感觉我的学习的路子应该是对的,毕竟是新手,三个语言的基础的算子还是都要了解一下的。