利用飞腾派进行OpenCV开发

实验目标:

完成飞腾平台OpenCV开发。

实验大纲:

  1. Mat数据结构
  2. 加载、显示、保存图像
  3. 读写像素
  4. RGB图像分离
  5. 彩色图转灰度图
  1. Mat数据结构

Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素
值)。创建示例如下:

Mat img;   //创建无初始化矩阵
Mat img1(2, 3, CV_8UC1); //创建2行3列,类型为8位的单通道矩阵
Mat img2(Size(2, 3), CV_8UC1); //创建大小为2x3类型为8位的3通道矩阵
Mat img3(Size(2, 3), CV_8UC3, Scalar(0, 255, 0));//创建大小为2x3类型为8位的3通道矩阵
Mat img4(Size(2, 3), CV_8UC1, Scalar(0, 255, 0)); //创建大小为2x3类型为8位的单通道矩阵
Mat img5(img4); //将img4赋值给img5,共享数据对象

实验任务:

请创建一个指定大小Size、指定类型type的图像矩阵的矩阵体,并打印输出(2min)

1.1、头文件

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

1.2 main函数

	int main()
{Point pt;pt.x = 10;pt.y = 20;cout<<pt<<endl;Rect rect(10, 20, 10, 10);cout<<rect<<endl;int sz[3] = {2,2,2};Mat M(3,sz,CV_8U,Scalar::all(0));//Mat img = imread("1.jpg");//cout<<img<<endl;//Mat img;   //Mat img1(2, 3, CV_8UC1);//Mat img2(Size(2, 3), CV_8UC1);//Mat img3(Size(2, 3), CV_8UC3, Scalar(0, 255, 0));//Mat img4(Size(2, 3), CV_8UC1, Scalar(0, 255, 0));Mat img = imread("1.png");Mat img2(img);Mat img3 = img;Mat img4 = img.clone();Mat img5;img.copyTo(img5);//cvtColor(img, img, CV_BGR2Lab);imshow("img", img);imshow("img2", img2);imshow("img3", img3);imshow("img4", img4);imshow("img5", img5);waitKey(0);
}

.3、编译、运行

#g++ main.c -o main `pkg-config --cflags --libs opencv4`
#./main

2,加载、显示、保存图像

2.1、头文件

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include<iostream>using namespace cv;
using namespace std;

2.2、main函数

int main()
{Mat Img = imread("/home/phytium/opencv_text/tuanzi.png");if(Img.empty()){cout<<"read image error!"<<endl;return 0;}imshow("img", Img);imwrite("tuan.bmp", Img);waitKey(0);
}

2.3、编译、运行

#g++ main.c -o main `pkg-config --cflags --libs opencv4`
#./main

3、读写像素

3.1 、头文件

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

 3.2、main文件

int main()
{///动态地址访问//Mat img = imread("1.jpg");//imshow("src", img);//Mat dst = img.clone();//int rowNumber = img.rows;  //获取行数//int colNumber = img.cols;  //获取列数//for(int i = 0; i<rowNumber; i++)//{//	for(int j = 0; j<colNumber; j++)//	{//		dst.at<Vec3b>(i, j)[0] = 255;  //蓝色通道//		dst.at<Vec3b>(i, j)[1] = 0;  //绿色通道//		dst.at<Vec3b>(i, j)[2] = 0;  //红色通道//	}//}//imshow("dst", dst);//waitKey(0);//指针访问
/*Mat img = imread("/home/phytium/opencv_text/1.jpg");imshow("src", img);Mat dst = img.clone();int rowNumber = img.rows;  //获取行数int colNumber = img.cols * img.channels();  //获取每一行的元素for(int i = 0; i<rowNumber; i++){uchar* data = dst.ptr<uchar>(i);  //获取每一行首地址for(int j = 0; j<colNumber; j++){switch(j % 3){case 0:  //蓝色通道data[j] = 255;break;case 1:  //绿色通道data[j] = 0;break;case 2:  //红色通道data[j] = 255;break;}}}imshow("dst", dst);waitKey(0);
*/waitKey(0);}///雪花效果Mat img = imread("/home/phytium/opencv_text/1.jpg");imshow("src", img);Mat dst = img.clone();int rowNumber = img.rows;  //获取行数int colNumber = img.cols;  //获取列数int i, j;for(int k = 0; k< 2000; k++){i = rand() % rowNumber; //产生0~rowNumber之间的随机整数j = rand() % colNumber; dst.at<Vec3b>(i, j)[0] = 255;  //蓝色通道dst.at<Vec3b>(i, j)[1] = 255;  //绿色通道dst.at<Vec3b>(i, j)[2] = 255;  //红色通道}imshow("dst", dst);

3.3、编译运行 

#g++ main.c -o main `pkg-config --cflags --libs opencv4`
#./main

4、RGB图像分离

4.1、头文件

#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;

 4.2、main函数

4.2.1.split()函数
int main()
{Mat img = imread("/home/phytium/opencv_text/1.jpg");Mat dst;vector<Mat> channels;split(img, channels);Mat blueChannel = channels.at(0);Mat greenChannel = channels.at(1);Mat redChannel = channels.at(2);merge(channels, dst);//imshow("Blue", blueChannel);//imshow("green", greenChannel);//imshow("red", redChannel);imshow("dst", dst);waitKey(0);}
 4.2.2自实现
void own_split_kernel(uint8_t* r, uint8_t* g, uint8_t* b, uint8_t* rgb, int size){for(int i=0; i<size; ++i){b[i] = rgb[3*i];g[i] = rgb[3*i + 1];r[i] = rgb[3*i + 2];}
}void own_rgb_split(Mat src){int size = src.rows * src.cols;uint8_t *rgb = src.data;uint8_t* r = (uint8_t*)malloc(sizeof(uint8_t) * size);uint8_t* g = (uint8_t*)malloc(sizeof(uint8_t) * size);uint8_t* b = (uint8_t*)malloc(sizeof(uint8_t) * size);own_split_kernel(r, g, b, rgb, size);free(r);free(g);free(b);
}int main(int argc, char** argv){Mat img = cv::imread("/home/phytium/opencv_text/person.png");own_rgb_split(img);return 0;
}

 4.3、编译、运行

#g++ main.c -o main `pkg-config --cflags --libs opencv4`
#./main

5、彩色图转灰度图 

5.1、头文件

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include<iostream>using namespace cv;
using namespace std;

5.2、main函数

5.2.1、cvtColor函数
int main()
{Mat Img = imread("/home/phytium/opencv_text/tuanzi.png");if(Img.empty()){cout<<"read image error!"<<endl;return 0;}Mat dstImg;imshow("img", Img);cvtColor(Img,dstImg,COLOR_BGR2GRAY);imshow("Gray Img", dstImg);waitKey(0);
}
 5.2.2、自实现
//origin
void RGB2Y(unsigned char *Src, unsigned char *Dest, int Width, int Height, int Stride) {for (int Y = 0; Y < Height; Y++) {unsigned char *LinePS = Src + Y * Stride;unsigned char *LinePD = Dest + Y * Width;for (int X = 0; X < Width; X++, LinePS += 3) {LinePD[X] = int(0.114 * LinePS[0] + 0.587 * LinePS[1] + 0.299 * LinePS[2]);}}
}int main() {Mat src = imread("/home/phytium/opencv_text/1.jpg");int Height = src.rows;int Width = src.cols;int Stride = Width*3;unsigned char *Src = src.data;unsigned char *Dest1 = new unsigned char[Height * Width];RGB2Y(Src, Dest1, Width, Height, Stride);Mat dst(Height, Width, CV_8UC1, Dest1);imshow("origin", src);imshow("result1", dst);waitKey(0);return 0;
}

5.3、编译、运行 

#g++ main.c -o main `pkg-config --cflags --libs opencv4`
#./main


 实验中遇到问题找到的解决方法:



遇到命令行错行问题:改设置——在黑框里右击鼠标进行设置

运行cpp文件,进入SHH;输入   ifconfig   找host:

 `pkg-config --cflags --libs opencv4` 被当作一个文件名来处理,而不是作为一个命令来执行。要正确使用 `pkg-config`,需要将其放在反引号或 `$()` 中,以便在命令执行时获取其输出。修正后的命令:


g++ laplace.cpp $(pkg-config --cflags --libs opencv4) -o laplace
 

或者使用反引号:


g++ laplace.cpp `pkg-config --cflags --libs opencv4` -o laplace

`$(...)` 或 `` `...` `` 是命令替换的语法,它会执行括号内的命令并将输出结果替换到命令中。
`pkg-config --cflags --libs opencv4` 会返回 OpenCV 的编译和链接所需的标志。

运行命令:

在终端中运行修正后的命令后,应该能够成功编译 `laplace.cpp` 文件并生成可执行文件 `laplace`。如果仍然遇到问题,请确保你已经安装了 OpenCV 和 pkg-config,并且 OpenCV 的 pkg-config 文件在系统的路径中。

 使用cat命令查看:

g++ -o laplace src/backend/main.cpp `pkg-config --cflags --libs opencv4`

然后运行:

./laplace 

 

在VScode下载SHH插件即可连接远程文件:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 选中对话框时,对话框右侧出一个箭头

先看下做出的效果&#xff1a; html代码&#xff0c;其中listPlan.records是后台拿到的数据进行遍历 <template><ul class"list"><li style"height: 180px;width: 95%":key"index"v-for"(item, index) in listPlan.record…

Android 判断手机放置的方向

#1024程序员节&#xff5c;征文# 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 需求 老板&#xff1a;我有个手持终端&#xff0c;不能让他倒了&#xff0c;当他倒或者倾斜的时候要发出报警&#xff1b; 程序猿&#xff1a;我这..... 老板…

Servlet(三)-------Cookie和session

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件&#xff0c;由服务器发送给浏览器。当用户再次访问同一网站时&#xff0c;浏览器会把Cookie信息发送回服务器。例如&#xff0c;网站可以利用Cookie记住用…

Python与MySQL

一、Python 操作 MySQL 数据库软件 我们在上一篇文章《SQL入门》中使用了图形化工具DBeaver操作MySQL数据库软件&#xff0c;除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行 SQL 从而操作数据库&#xff0c;可以在 Python 中&#xff0c;使用第三方库 pymys…

设计师的新宠:7款不容错过的界面设计软件

在UI设计领域&#xff0c;设计师们常常需要借助各种工具来实现他们的创意。市场上众多的设计软件让设计师们有了丰富的选择&#xff0c;但同时也带来了选择困难。一个好的软件界面设计工具不仅能提升工作效率&#xff0c;还能为设计师提供丰富的资源和参考&#xff0c;帮助他们…

Python:背景知识及环境安装

一、计算机的基础概念 1.1 什么是计算机&#xff1f; 最早我们有计算器&#xff0c;但是他只能完成算数运算的功能 而计算机能完成的工作有&#xff1a; &#xff08;1&#xff09;算术运算 &#xff08;2&#xff09;逻辑判断 &#xff08;3&#xff09;数据存储 &#xff08…

使用AutoDL训练YOLO等计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

前言 本文记录利用AutoDL云服务器&#xff0c;使用VS Code远程连接进行模型训练&#xff0c;步骤完整&#xff0c;操作简便&#xff0c;不需要使用任何命令即可快速运行&#x1f680;。 专栏目录&#xff1a;YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Bac…

分享几个办公类常用的AI工具

办公类 WPS AI讯飞智文iSlideProcessOn亿图脑图ChatPPT WPS AI 金山办公推出的协同办公 AI 应用&#xff0c;具有文本生成、多轮对话、润色改写等多种功能&#xff0c;可以辅助用户进行文档编辑、表格处理、演示文稿制作等办公操作。 https://ai.wps.cn/ 讯飞智文 科大讯飞推…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

企业数字化转型建设方案(数据中台、业务中台、AI中台)

方案介绍&#xff1a; 企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数据的整合、治理、共享和应用&#xff0c;将数据转化为资产&#xff0c;服务于业务决策和运营。业务中台是连接数据中台和技术中台的桥梁&#xff0c;负责业务的抽象…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

DSPy:不需要手写prompt啦,You Only Code Once!

论文地址&#xff1a;https://arxiv.org/abs/2310.03714   项目地址&#xff1a;https://github.com/stanfordnlp/dspy 文章目录 1. 背景2. 签名3. 模块3.1 预测模块3.2 其他内置模块 4. 提词器5. 评估目标6. 代码分析6.1 _prepare_student_and_teacher6.2 _prepare_predicto…

985研一,转嵌入式好还是后端开发好?

有个老铁问&#xff0c;985研一&#xff0c;转嵌入式好还是后端开发好&#xff1f; 我认为&#xff0c;这学历&#xff0c;两个随便挑&#xff0c;我说的&#xff0c;从趋势来看&#xff0c;更建议嵌入式&#xff0c;走供应链上游&#xff0c;芯片原厂、新能源车企、军工或者搞…

力扣143:重排链表

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示…

qt creator 转 visual stdio 项目调试

因果 大家在使用qt creator调试程序时&#xff0c;会出现未知错误&#xff0c;比如下图&#xff0c;直接release运行就没有问题。由于调试复杂程序&#xff0c;使用qt creator都感觉不如vs&#xff0c;会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…

【电子元件】光通量和色温 (欧司朗LED灯珠 KW3 CGLNM1.TG命名规则)

什么是光通量&#xff1f; 光通量&#xff08;Luminous Flux&#xff09;是衡量光源在单位时间内发出的可见光总量的物理量&#xff0c;表示的是光源产生的总光能量&#xff0c;其中只考虑人眼能感知的部分。它通常以流明&#xff08;lumen&#xff0c;符号为 lm&#xff09;为…

如何使用gitlab切换分支

第一步&#xff0c;在gitlab上新建一个远程分支。选择New branch即可新建一个&#xff0c;但是注意往往是在当前分支下新建的分支&#xff0c;所以新分支里会有当前分支的内容。 第二步&#xff0c;在本地当前分支在运行这三行命令&#xff0c;即可得到一个空的新分支。 git c…

springboot2.0x 和springboot 1.0 整合redis 使用自定义CacheManager 问题

问题描述&#xff1a; 在我们深入理解springboot2.0x的缓存机制的时候&#xff0c;发现在springboot1.0 和springboot2.0 中默认的序列化都是使用的jdk的 Serializer 实现这个接口&#xff0c;jdk自带的序列化方法&#xff0c;由此我们需要自己去创建自定义的RedisCacheManager…

《Python游戏编程入门》注-第2章2

《Python游戏编程入门》的“2.2.5 绘制线条”中提到了通过pygame库绘制线条的方法。 1 相关函数介绍 通过pygame.draw模块中的line()函数来绘制线条&#xff0c;该函数的格式如下所示。 line(surface, color, start_pos, end_pos, width1) -> Rect 其中&#xff0c;第一…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…