【OpenCV实战】2.OpenCV基本数据类型实战

这篇具有很好参考价值的文章主要介绍了【OpenCV实战】2.OpenCV基本数据类型实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

〇、实战内容

  1. OpenCV helloworld
  2. Image的基本操作
  3. OpenCV 基本数据类型
  4. 遍历图片,读取图片的像素
  5. 图片反色
  6. 矩阵基本操作

1 OpenCV helloworld

1.1 文件结构类型
assign_1
	build [cmake build所用]
	assign_1.cpp
	CMakeLists.txt
	img.webp

图片地址

1.2 CMakeList.txt
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
project(assign1)
find_package(OpenCV 3 REQUIRED HINTS /usr/local/opt/opencv@3) 
add_executable(assign1 assign_1.cpp)
target_link_libraries(assign1 ${OpenCV_LIBS})
  1. cmake 3.10版本
  2. 使用C++ 11
  3. project 名字为assign1
  4. find_package寻找opencv@3库
1.3 Helloworld

assign_1.cpp

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <string>

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
	Mat image = imread("/Users/..../computerphotography/course_zhengjiangdaxue/opencv-logo.png"); // 载入名为 "opencv-logo.png" 的图片
	namedWindow("hello");    // 创建一个标题为 "hello" 的窗口
	imshow("hello", result); // 在窗口 "hello" 中显示图片
	waitKey(0);              // 等待用户按下键盘
	destroyWindow("hello");  // 销毁窗口 "hello"
	return 0;
}

2. Image的基本操作

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <string>
using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
	Mat image = imread("/Users/..../computerphotography/course_zhengjiangdaxue/opencv-logo.png"); // 载入名为 "opencv-logo.png" 的图片
    cout << "image size 1: " << image.size() << endl;
    cout << "image 行数: " << image.rows << endl;
    cout << "image 列数: " << image.cols << endl;
    cout << "image 通道数: " << image.channels() << endl;
    cout << "image type: " << image.type() << endl;

	return 0;
}

输出结果

image size 1: [200 x 200]
image 行数: 200
image 列数: 200
image 通道数: 3
image type: 16

3. OpenCV 基本数据类型

int main(int argc, char *argv[])
{
    cout << "CV_8UC1:" << CV_8UC1 << endl;
    cout << "CV_8UC2:" << CV_8UC2 << endl;
    cout << "CV_8UC3:" << CV_8UC3 << endl;
    cout << "CV_8UC4:" << CV_8UC4 << endl;
    cout << "CV_8UC5:" << CV_8UC(5) << endl;

    cout << "CV_8SC1:" << CV_8SC1 << endl;
    cout << "CV_8SC2:" << CV_8SC2 << endl;
    cout << "CV_8SC3:" << CV_8SC3 << endl;
    cout << "CV_8SC4:" << CV_8SC4 << endl;
    cout << "CV_8SC5:" << CV_8SC(5) << endl;

    cout << "CV_16UC1:" << CV_16UC1 << endl;
    cout << "CV_16UC2:" << CV_16UC2 << endl;
    cout << "CV_16UC3:" << CV_16UC3 << endl;
    cout << "CV_16UC4:" << CV_16UC4 << endl;
    cout << "CV_16UC5:" << CV_16UC(5) << endl;

    cout << "CV_16SC1:" << CV_16SC1 << endl;
    cout << "CV_32SC1:" << CV_32SC1 << endl;
    cout << "CV_32FC1:" << CV_32FC1 << endl;
    cout << "CV_64FC1:" << CV_64FC1 << endl;
}

输出结果

CV_8UC1:0
CV_8UC2:8
CV_8UC3:16
CV_8UC4:24
CV_8UC5:32
CV_8SC1:1
CV_8SC2:9
CV_8SC3:17
CV_8SC4:25
CV_8SC5:33
CV_16UC1:2
CV_16UC2:10
CV_16UC3:18
CV_16UC4:26
CV_16UC5:34
CV_16SC1:3
CV_32SC1:4
CV_32FC1:5
CV_64FC1:6
  1. CV_8UC1 8字节无符号类型,通道为1
  2. CV_8UC3 8字节无符号类型,通道为3 即一个长度为3的数据例如[255,255,255] 三通道基本代表R, G, B
  3. image.type() == 16 == CV_8UC3 即改图片是3通道
  4. 单通道,增加一通道,值增加8
    CV_8UC1->0 -> uchar
    CV_8SC1->1 -> char
    CV_16UC1->2 -> ushort
    CV_16SC1->3 -> short
    CV_32SC1->4 -> int
    CV_32FC1->5 -> float
    CV_64FC1->6 -> double

4. 读取图片的像素 & 遍历图片

4.1 获取制定像素
int main(int argc, char *argv[])
{
    // 3. 获取某一个像素值
    cout << "image at 0: " << image.at<Vec3b>(0) << endl;
    cout << "image at 10000000: " << image.at<Vec3b>(10000000) << endl;
    cout << "image at 39999: " << image.at<Vec3b>(39999) << endl;
    cout << "image at 199,199: " << image.at<Vec3b>(199, 199) << endl;

}

输出:

image at 0: [255, 255, 255]
image at 10000000: [0, 0, 0]
image at 39999: [255, 255, 255]
image at 199,199: [255, 255, 255]
  1. at方法
    a. 需要制定对应的类型,单通道见Section3 说明;二通道Vec2b Vec2i Vec2f Vec2d
    b. 参数可为1个,200 * 200 即 0<=index <=39999;参数为2个,则对应的行和列
  2. 超出索引也可获取值
4.2 遍历图片
int main(int argc, char *argv[])
{

    // //5. 遍历图片像素,方法1,便利,判断是白色,赋值为黑色
    for(int i = 0;i<image.rows;i++){
        for(int j=0;j<image.cols;j++){
            if(image.at<Vec3b>(i,j) == white){
                image.at<Vec3b>(i,j) = black;
            }
        }
    }

}

5. 图片反色

5.1 方法1 :遍历
int main(int argc, char *argv[])
{
    Vec3b white(255, 255, 255);
   for(int i = 0;i<image.rows;i++){
       for(int j=0;j<image.cols;j++){
           image.at<Vec3b>(i,j) = white - image.at<Vec3b>(i,j);
       }
   }
}
  1. 定义白色Vec3b white(255, 255, 255);
  2. 遍历图片用white减去每个像素颜色
5.2 方法2 :矩阵减法
  Mat m(image.rows,image.cols,CV_8UC3,Scalar(255,255,255));
  image = m-image;
  1. Mat 代表opencv里的矩阵
  2. 初始化的时候传入行数,列数,每个像素的数据格式,以及初始值
    a. 如果CV_8UC1 就是Scalar(255)
    b. 如果CV_8UC2 就是Scalar(255, 255)
  3. 初始化了一个CV_8UC3, 和原始图片一样大的矩阵,然后做减法

6. 矩阵基本运算

int main(){

    Mat origin(10, 10, CV_32FC1, Scalar(0));
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (i == j)
            {
                cout << "i=" << i << "j=" << j << endl;
                origin.at<float>(i, j) = 2.0;
            }
            else if ((i == j - 1) || (i == j + 1))
            {
                origin.at<float>(i, j) = -1.0;
            }
        }
    }
    // 矩阵 的逆
    Mat invert = origin.inv();
    cout << "origin mat:"<<endl;
    print(origin);
    cout << endl<<"invert mat:"<<endl;
    print(invert);
    //矩阵加法
    cout << endl<< "add mat:"<<endl;
    origin = origin+invert;
    print(origin);
    //矩阵乘法
    cout << endl<< "multiply mat:"<<endl;
    origin = origin*invert;
    print(origin);
    //初始化对角线
    cout << endl<< "eye mat:"<<endl;
    Mat eye = Mat::eye(10,10,CV_32FC1);
    print(eye);
    cout << endl<< "normalize mat:"<<endl;
    Mat result;
    //归一化,最大的位白色,最小的为黑色
    normalize(invert, result, 1.0, 0.0, CV_MINMAX);
    // 现实窗口逻辑
    print(result);
    cout << endl;
	return 0;
}

输出结果:文章来源地址https://www.toymoban.com/news/detail-669001.html

origin mat:
[2, -1, 0, 0, 0, 0, 0, 0, 0, 0;
 -1, 2, -1, 0, 0, 0, 0, 0, 0, 0;
 0, -1, 2, -1, 0, 0, 0, 0, 0, 0;
 0, 0, -1, 2, -1, 0, 0, 0, 0, 0;
 0, 0, 0, -1, 2, -1, 0, 0, 0, 0;
 0, 0, 0, 0, -1, 2, -1, 0, 0, 0;
 0, 0, 0, 0, 0, -1, 2, -1, 0, 0;
 0, 0, 0, 0, 0, 0, -1, 2, -1, 0;
 0, 0, 0, 0, 0, 0, 0, -1, 2, -1;
 0, 0, 0, 0, 0, 0, 0, 0, -1, 2]
invert mat:
[0.90909088, 0.81818181, 0.72727281, 0.63636357, 0.54545444, 0.45454538, 0.36363626, 0.27272728, 0.18181814, 0.090909071;
 0.81818181, 1.6363636, 1.4545456, 1.2727271, 1.0909089, 0.90909076, 0.72727251, 0.54545456, 0.36363629, 0.18181814;
 0.72727281, 1.4545456, 2.1818185, 1.9090908, 1.6363634, 1.3636361, 1.0909088, 0.81818181, 0.54545444, 0.27272722;
 0.63636369, 1.2727274, 1.909091, 2.5454543, 2.1818178, 1.8181814, 1.4545449, 1.090909, 0.72727257, 0.36363629;
 0.54545456, 1.0909091, 1.6363636, 2.1818178, 2.7272723, 2.2727268, 1.8181812, 1.3636363, 0.9090907, 0.45454535;
 0.45454544, 0.90909088, 1.3636363, 1.8181814, 2.2727268, 2.7272723, 2.1818175, 1.6363635, 1.0909089, 0.54545444;
 0.36363637, 0.72727275, 1.090909, 1.4545451, 1.8181815, 2.1818178, 2.545454, 1.9090909, 1.2727271, 0.63636357;
 0.27272728, 0.54545456, 0.81818181, 1.0909089, 1.3636363, 1.6363634, 1.9090906, 2.1818182, 1.4545454, 0.72727269;
 0.18181817, 0.36363634, 0.54545456, 0.72727257, 0.90909082, 1.0909089, 1.2727271, 1.4545454, 1.6363635, 0.81818175;
 0.090909094, 0.18181819, 0.27272728, 0.36363631, 0.45454541, 0.54545444, 0.63636357, 0.72727275, 0.81818175, 0.90909088]
add mat:
[2.909091, -0.18181819, 0.72727281, 0.63636357, 0.54545444, 0.45454538, 0.36363626, 0.27272728, 0.18181814, 0.090909071;
 -0.18181819, 3.6363635, 0.45454562, 1.2727271, 1.0909089, 0.90909076, 0.72727251, 0.54545456, 0.36363629, 0.18181814;
 0.72727281, 0.45454562, 4.1818185, 0.90909076, 1.6363634, 1.3636361, 1.0909088, 0.81818181, 0.54545444, 0.27272722;
 0.63636369, 1.2727274, 0.909091, 4.545454, 1.1818178, 1.8181814, 1.4545449, 1.090909, 0.72727257, 0.36363629;
 0.54545456, 1.0909091, 1.6363636, 1.1818178, 4.727272, 1.2727268, 1.8181812, 1.3636363, 0.9090907, 0.45454535;
 0.45454544, 0.90909088, 1.3636363, 1.8181814, 1.2727268, 4.727272, 1.1818175, 1.6363635, 1.0909089, 0.54545444;
 0.36363637, 0.72727275, 1.090909, 1.4545451, 1.8181815, 1.1818178, 4.545454, 0.90909088, 1.2727271, 0.63636357;
 0.27272728, 0.54545456, 0.81818181, 1.0909089, 1.3636363, 1.6363634, 0.90909064, 4.181818, 0.45454538, 0.72727269;
 0.18181817, 0.36363634, 0.54545456, 0.72727257, 0.90909082, 1.0909089, 1.2727271, 0.45454538, 3.6363635, -0.18181825;
 0.090909094, 0.18181819, 0.27272728, 0.36363631, 0.45454541, 0.54545444, 0.63636357, 0.72727275, -0.18181825, 2.909091]
multiply mat:
[4.181818, 5.4545455, 6.909091, 7.6363621, 7.7272706, 7.2727251, 6.3636341, 5.0909085, 3.5454535, 1.8181813;
 5.454545, 11.090909, 13.090909, 14.63636, 14.909087, 14.090905, 12.363631, 9.9090891, 6.9090891, 3.5454535;
 6.9090915, 13.09091, 18.818182, 20.363632, 20.999994, 19.999994, 17.636356, 14.181816, 9.9090881, 5.0909076;
 7.636363, 14.636362, 20.363634, 25.18181, 25.454536, 24.545444, 21.818171, 17.63636, 12.363632, 6.3636341;
 7.727272, 14.909089, 20.999996, 25.454536, 28.727262, 27.272717, 24.545443, 19.999994, 14.090904, 7.2727246;
 7.2727261, 14.090907, 19.999996, 24.545444, 27.272717, 28.727262, 25.454533, 20.999994, 14.909085, 7.7272701;
 6.3636355, 12.363635, 17.636362, 21.818174, 24.545446, 25.454536, 25.181808, 20.363632, 14.63636, 7.6363616;
 5.090909, 9.90909, 14.181817, 17.636358, 19.999994, 20.999994, 20.36363, 18.81818, 13.090906, 6.9090896;
 3.5454543, 6.9090905, 9.90909, 12.363633, 14.090905, 14.909086, 14.636359, 13.090907, 11.090907, 5.4545441;
 1.8181818, 3.5454545, 5.090909, 6.3636351, 7.2727256, 7.7272706, 7.6363616, 6.9090905, 5.4545445, 4.181818]
eye mat:
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 1, 0, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 1, 0, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 1, 0, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 1, 0, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 1, 0, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 1, 0, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 1, 0, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 1, 0;
 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
normalize mat:
[0.31034487, 0.27586213, 0.24137938, 0.20689656, 0.17241378, 0.13793103, 0.10344826, 0.068965539, 0.034482758, 1.3546499e-09;
 0.27586213, 0.58620697, 0.51724154, 0.44827589, 0.37931034, 0.31034482, 0.24137928, 0.17241383, 0.10344827, 0.034482758;
 0.24137938, 0.51724154, 0.79310369, 0.68965524, 0.58620691, 0.48275861, 0.37931028, 0.27586213, 0.17241378, 0.068965517;
 0.2068966, 0.44827598, 0.6896553, 0.93103451, 0.7931034, 0.65517235, 0.51724124, 0.37931037, 0.24137929, 0.10344827;
 0.17241383, 0.37931043, 0.58620697, 0.7931034, 1, 0.82758617, 0.65517229, 0.48275867, 0.31034482, 0.13793102;
 0.13793106, 0.31034487, 0.48275867, 0.65517235, 0.82758617, 1, 0.79310334, 0.58620691, 0.37931034, 0.17241378;
 0.1034483, 0.24137937, 0.37931037, 0.51724136, 0.65517241, 0.7931034, 0.93103445, 0.68965524, 0.44827589, 0.20689656;
 0.068965539, 0.17241383, 0.27586213, 0.37931034, 0.48275867, 0.58620691, 0.68965518, 0.79310358, 0.51724142, 0.24137934;
 0.03448277, 0.10344829, 0.17241383, 0.24137929, 0.31034485, 0.37931034, 0.44827589, 0.51724142, 0.58620691, 0.2758621;
 9.8328981e-09, 0.034482773, 0.068965539, 0.10344828, 0.13793105, 0.17241378, 0.20689656, 0.24137937, 0.2758621, 0.31034487]
a123456@lucky build % 

到了这里,关于【OpenCV实战】2.OpenCV基本数据类型实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV 数据类型及赋值取值

     在之前的博客 OpenCV 32F 与 8U Mat数据类型相互转换(C++版) 已经提到,OpenCV Mat 类型及对应编号,如下表:    其中C1~C4为通道数,经常使用的数据类型对应如下表所示:    其中: FLT_MAX = 3.402823466e+38 FLT_MIN = 1.175494351e-38 DBL_MAX = 1.7976931348623158e+308 DBL_MIN = 2.2250738585072014e-308 如果

    2024年02月09日
    浏览(20)
  • 一 OpenCV中的数据类型

    1. cv::Mat 2. cv::Point 主要用来表示二维点,也有表示三维点的模板类型; cv::Point p(int,  int)  最常用 ① cv::Point_T ② cv::Point2i          cv::Point_int ③ cv::Point2f          cv::Point_float ④ cv::Point2d         cv::Point_double ⑤ cv::Point2l          cv::Point_int64 cv::Point3(int,  int,  int) ①

    2024年02月05日
    浏览(15)
  • 使用计算机视觉实战项目精通 OpenCV:6~8

    原文:Mastering OpenCV with Practical Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。 非刚

    2023年04月21日
    浏览(26)
  • 计算机视觉实战--OpenCV进行红绿灯识别

    前言: Hello大家好,我是Dream。 OpenCV是一个开源的计算机视觉库 ,可以用于实现各种图像和视频处理任务,包括红绿灯识别。可以帮助自动驾驶汽车、智能交通系统等设备准确地识别红绿灯的状态,以便做出正确的决策。今天,就有Dream带领大家复盘一下计算机视觉中最经典

    2024年02月07日
    浏览(13)
  • OpenCV中有许多常用的数据类型

    OpenCV中有许多常用的数据类型,以下是其中一些常见的数据类型: cv::Mat:用于表示图像和矩阵的类。 cv::Point:用于表示二维平面上的点,包含 x 和 y 坐标。 cv::Rect:用于表示矩形区域,包含左上角的点和矩形的宽度和高度。 cv::Size:用于表示尺寸,包含宽度和高度。 cv::S

    2024年01月19日
    浏览(15)
  • OpenCV实战(2)——OpenCV核心数据结构

    cv::Mat 类是用于保存图像(以及其他矩阵数据)的数据结构,该数据结构是所有 OpenCV 类和函数的核心,这是 OpenCV 库的一个关键元素,用于处理图像和矩阵(从计算和数学的角度来看,图像本质上是一个矩阵)࿰

    2024年02月02日
    浏览(11)
  • 【实战精选】基于计算机视觉OpenCV的答题卡识别系统

    项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着科技的不断发展,计算机视觉技术在各个领域中的应用越来越广泛。其中,基于计算机视觉的答题卡识别系统在教育领域中具有重要的意义。传统的答题卡批阅方式需要大量的人力和时间,容易

    2024年04月25日
    浏览(14)
  • Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 一

    目录 Python 基于 OpenCV 视觉图像处理实战 之 图像相关的基本概念,以及图像的基础操作 一 一、简单介绍 二、图像相关的一些基本概念 1、像素 2、图像的构成 3、图像的格式 4、图像的位深和通道 三、OpenCV 的一些基本图像处理函数介绍 1、读取一幅画图像 2、显示图像 3、输出

    2024年04月11日
    浏览(17)
  • 实战指南:使用OpenCV 4.0+Python进行机器学习与计算机视觉

    💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 计算机视觉和机器学习的融合为我们带来了前所未有的机会和挑战。从智能助手到

    2024年02月13日
    浏览(17)
  • 四、基本数据类型和计算(三)

    四、基本数据类型和计算(三) 1、枚举变量 1)通过案例体现枚举类型的作用 ​假设要为我们的游戏装备设置稀有度属性,应该如何设计 装备级别 变量名 普通 normal 高级 high 稀有 rare 史诗 epic 传说 legend 神话 myth 不使用枚举变量,使用常量方式设置 2)枚举变量定义及声明 ​

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包