知识点

1、图像保存 — imwrite
第一个参数是图像保存路径
第二个参数是图像内存对象
2、色彩空间转换函数 — cvtColor
COLOR_BGR2GRAY = 6 彩色到灰度
COLOR_GRAY2BGR = 8 灰度到彩色
COLOR_BGR2HSV = 40 BGR到HSV
COLOR_HSV2BGR = 54 HSV到BGR

C++代码

  1. #ifndef DAY02
  2. #define DAY02
  3. #include <opencv2/opencv.hpp>
  4. #include <iostream>
  5. using namespace std;
  6. using namespace cv;
  7. void day02() {
  8. Mat src = imread("E:\\_Image\\OpenCVTest\\girl.jpg");
  9. if (src.empty()) {
  10. cout << "could not load image.." << endl;
  11. return;
  12. }
  13. namedWindow("show", WINDOW_AUTOSIZE);
  14. imshow("show", src);
  15. Mat gray;
  16. cvtColor(src, gray, COLOR_BGR2GRAY);
  17. namedWindow("gray", WINDOW_AUTOSIZE);
  18. imshow("gray", gray);
  19. imwrite("E:\\_Image\\OpenCVTest\\girl_gray.jpg", gray);
  20. if (gray.type() == CV_8UC1) {
  21. //input image is grayscale
  22. cout << "gray" << endl;
  23. }
  24. else {
  25. //input image is colour
  26. cout << "color" << endl;
  27. }
  28. waitKey(0);
  29. }
  30. #endif

注意事项:
1、COLOR_GRAY2BGR 要求图像的类型是 CV_8UC1。该函数的原理是将图像的通道变多,但是每个像素点三通道的像素值还是一样!所以即使转换成功,图像依旧是灰色的。

2、读取图像的 imread() 函数有第二个参数,其默认值是 IMREAD_COLOR ,即将加载的图像总是转换为彩色图像。转换后图像的类型是 CV_8UC3。

Python代码

  1. import cv2 as cv
  2. # 查看版本
  3. print(cv.__version__)
  4. # 读取图像
  5. src = cv.imread("E:/_Image/OpenCVTest/girl.jpg")
  6. # 显示图像
  7. cv.imshow("input", src)
  8. # 彩色转灰度
  9. gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
  10. # 显示图像
  11. cv.imshow("gray", gray)
  12. # 保存图像
  13. cv.imwrite("E:/_Image/OpenCVTest/girl_gray.jpg", gray)
  14. # 等待键盘输入
  15. cv.waitKey()
  16. # 释放内存
  17. cv.destroyAllWindows()

JS代码

  1. // 官方文档链接:https://docs.opencv.org/4.5.0/db/d64/tutorial_js_colorspaces.html
  2. const cv = window.cv
  3. // 读取图像
  4. const src = cv.imread('imageSrcRaw')
  5. // 转换为灰度图
  6. const gray = new cv.Mat()
  7. cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0)
  8. // 显示图像
  9. cv.imshow('canvasOutput', gray)
  10. // opencv.js不支持imwrite方法
  11. // 销毁所有 mat 释放内存
  12. src.delete()
  13. gray.delete()

注意事项:

1、opencv.js 不支持 imwrite 方法。仔细想想也可以理解,毕竟是 web 端程序,不可以随意往服务器端保存东西呀。

2、但是,如果看官用的是 opencv4nodejs,它是提供 imwrite 方法的,亲测。这是专门用于服务器端的 opencv,注意我说的是服务器端,而不是 web 端。意思是 opencv4nodejs 可以用于 nodejs 写的服务器端,但是直接在浏览器是无法运行的。具体如何安装 opencv4nodejs 可以看我写的这篇文章:OpenCV-npm安装opencv4nodejs(Windows)

3、官方文档链接:https://docs.opencv.org/4.5.0/db/d64/tutorial_js_colorspaces.html

image.png