0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于LockAI视觉识别模块:C++图像的基本运算

福州市凌睿智捷电子有限公司 2025-05-06 16:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍 基于LockAI视觉识别模块下OpenCV 中图像的基本运算方法,包括像素操作、逻辑运算和差值运算,并通过一个综合示例展示其实际应用。

1. 基本知识讲解

1.1 图像坐标系

在图像处理中,坐标是一个非常重要的概念:

原点:图像的左上角为原点 (0, 0)。

x 轴:从左到右递增。

y 轴:从上到下递增。

1.2 图像的基本属性

每张图像都有以下基本属性:

宽度(Width):图像的列数。

高度(Height):图像的行数。

通道数(Channels):

灰度图:1 个通道。

彩色图:通常为 3 个通道(BGR)。

1.3 图像的基本操作

图像的基本操作包括:

获取和设置像素值:访问和修改图像中的像素值。

逻辑运算:如按位与、或、异或等。

差值运算:计算两张图像之间的差异。


2.API文档

2.1 头文件

#include

2.2 获取设置像素点

ucharcv::at<uchar>(introw,intcol)const;// 灰度图
cv::Vec3bcv::at<cv::Vec3b>(introw,intcol)const;// 彩色图

参数:

row:行索引(y坐标)

col:列索引(x坐标)

返回值:

对于灰度图,返回单通道值(unchar)

对于彩色图,返回三通道值(cv::Vec3b)

2.3 设置像素点:

voidcv::at<uchar>(introw,intcol)=value;// 灰度图
voidcv::at<cv::Vec3b>(introw,intcol)=value;// 彩色图

参数:

row:行索引(y坐标)

col:列索引(x坐标)

value:要设置的像素值(uchar或cv::Vec3b)

2.4 获取图像的宽度和高度

2.4.1 获取宽度

intcv::cols;

返回值

返回图像的宽度(列数)

2.4.2 获取高度

intcv::rows;

返回值

返回图像的高度(行数)

2.5 获取图像的格式和大小

2.5.1 判断是否为灰度图

intcv::channels();

返回值

1表示灰度图

3表示彩色图

2.5.2 获取图像大小(字节数)

size_tcv::total();// 总像素数
size_tcv::elemSize();// 每个像素的字节数
size_ttotalBytes=img.total()*img.elemSize();//计算公式

返回值

返回图像的总字节数

2.6 图像取反

voidcv::bitwise_not(InputArraysrc,OutputArraydst);

参数:

src:输入图像(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中

2.7 图像逻辑运算

2.7.1 按位与(AND)

voidcv::bitwise_and(InputArraysrc1,InputArraysrc2,OutputArraydst);

-参数:

src1:输入图像1(cv::Mat)

src2:输入图像2(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中

2.7.2 按位或(OR)

voidcv::bitwise_or(InputArraysrc1,InputArraysrc2,OutputArraydst);

参数:

src1:输入图像1(cv::Mat)

src2:输入图像2(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中

2.7.3 按位异或(XOR)

voidcv::bitwise_xor(InputArraysrc1,InputArraysrc2,OutputArraydst);

参数:

src1:输入图像1(cv::Mat)

src2:输入图像2(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中

2.7.4 按位取反(NOT)

voidcv::bitwise_not(InputArraysrc,OutputArraydst);

参数:

src:输入图像(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中

2.7.5 复杂的图像逻辑运算

如果需要实现复杂的逻辑运算(如NAND、NOR、NXOR等),可以通过组合上述基本函数来完成。例如:**NAND 与非运算

cv::MatnandResult;
cv::bitwise_and(img1,img2,nandResult);// 计算 AND
cv::bitwise_not(nandResult,nandResult);// 取反得到 NAND

通过这样的组合我们就可以实现更为复杂的逻辑运算了。

2.8 绝对差值

voidcv::absdiff(InputArraysrc1,InputArraysrc2,OutputArraydst);

参数:

src1:输入图像1(cv::Mat)

src2:输入图像2(cv::Mat)

dst:输出图像(cv::Mat)

返回值:

结果储存在dst中


3.综合代码解析

3.1 流程图

063be050-2a53-11f0-9434-92fbcf53809c.png

3.2 代码解析

像素操作

// 从(10,10)开始,宽40,高40,设置为蓝色
cv::Rectroi(10,10,40,40);
image1(roi).setTo(cv::Scalar(255,0,0));

图像变换

// 图像取反
cv::MatinvertedImage;
cv::bitwise_not(image1,invertedImage);
// 图像差分
cv::MatdiffImage;
cv::absdiff(image1,image2,diffImage);

显示结果

// 显示结果
cv::imshow("Original Image",image1);
cv::imshow("Inverted Image",invertedImage);
cv::imshow("Difference Image",diffImage);

3.3 代码实现

#include
#include
#include

intmain(intargc,char*argv[])
{
// 检查命令行参数数量是否正确
if(argc!=3)
{
std::cerr<<"Usage: "<<argv[0]<<" "<<std::endl;
return-1;
}

// 从命令行参数中读取图像路径
std::stringimage1Path=argv[1];
std::stringimage2Path=argv[2];

// 加载图像
cv::Matimage1=cv::imread(image1Path);
cv::Matimage2=cv::imread(image2Path);

// 检查图像是否加载成功
if(image1.empty()||image2.empty())
{
std::cerr<<"Error: Could not load images!"<<std::endl;
return-1;
}

// 获取图像尺寸
intwidth=image1.cols;
intheight=image1.rows;
std::cout<<"Image size: "<<width<<"x"<<height<<std::endl;

// 从(10,10)开始,宽40,高40,设置为蓝色
cv::Rectroi(10,10,40,40);
image1(roi).setTo(cv::Scalar(255,0,0));

// 图像取反
cv::MatinvertedImage;
cv::bitwise_not(image1,invertedImage);

// 图像差分
cv::MatdiffImage;
cv::absdiff(image1,image2,diffImage);

// 显示结果
cv::imshow("Original Image",image1);
cv::imshow("Inverted Image",invertedImage);
cv::imshow("Difference Image",diffImage);

cv::waitKey(0);
return0;
}


4. 编译过程

4.1 编译环境搭建

请确保你已经按照开发环境搭建指南正确配置了开发环境。

同时以正确连接开发板。

4.2 Cmake介绍

# CMake最低版本要求
cmake_minimum_required(VERSION3.10)

project(test-basic-method)

set(CMAKE_CXX_STANDARD17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 定义项目根目录路径
set(PROJECT_ROOT_PATH"${CMAKE_CURRENT_SOURCE_DIR}/../..")
message("PROJECT_ROOT_PATH = "${PROJECT_ROOT_PATH})

include("${PROJECT_ROOT_PATH}/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake")

# 定义 OpenCV SDK 路径
set(OpenCV_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module")
set(OpenCV_DIR"${OpenCV_ROOT_PATH}/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
set(OPENCV_LIBRARIES"${OpenCV_LIBS}")
# 定义 LockzhinerVisionModule SDK 路径
set(LockzhinerVisionModule_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk")
set(LockzhinerVisionModule_DIR"${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module")
find_package(LockzhinerVisionModule REQUIRED)

# 基本图像处理示例
add_executable(Test-basic-method basic_method.cc)
target_include_directories(Test-basic-method PRIVATE${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS})
target_link_libraries(Test-basic-method PRIVATE${OPENCV_LIBRARIES}${LOCKZHINER_VISION_MODULE_LIBRARIES})

install(
TARGETS Test-basic-method
RUNTIME DESTINATION .
)

4.3 编译项目

使用 Docker Destop 打开 LockzhinerVisionModule 容器并执行以下命令来编译项目

# 进入Demo所在目录
cd/LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/Cpp_example/B01_basic_method
# 创建编译目录
rm-rfbuild &&mkdirbuild &&cdbuild
# 配置交叉编译工具链
exportTOOLCHAIN_ROOT_PATH="/LockzhinerVisionModuleWorkSpace/arm-rockchip830-linux-uclibcgnueabihf"
# 使用cmake配置项目
cmake ..
# 执行编译项目
make-j8&&makeinstall

在执行完上述命令后,会在build目录下生成可执行文件。


5. 例程运行示例

5.1 运行过程

在凌智视觉模块中输入以下命令:

chmod777Test-basic-method
# 需要输入两张大小一样的图片
./Test-basic-method image1_path image2_path

5.2 运行结果

原始图像左上角加上一个40*40的矩形蓝像素点

图像差分结果:

0702f17c-2a53-11f0-9434-92fbcf53809c.png


6.总结

通过上述内容,我们介绍了图像的基本操作及其对应的 OpenCV API。按照以下步骤,您可以轻松地进行图像的基本运算:

获取和设置像素值:使用 cv::at 方法访问和修改像素。

逻辑运算:使用 cv::bitwise_and、cv::bitwise_or 等函数实现逻辑运算。

差值运算:使用 cv::absdiff 计算图像之间的差异。

复杂运算:通过组合基本函数实现更复杂的逻辑运算。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 视觉识别
    +关注

    关注

    3

    文章

    110

    浏览量

    17302
  • AI视觉
    +关注

    关注

    0

    文章

    104

    浏览量

    4945
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于LockAI视觉识别模块C++图像采集例程

    本文主要演示如何使用LockAI视觉识别模块进行视频流的读取,同时使用Edit模块进行图像传输。
    发表于 04-30 10:52

    基于LockAI视觉识别模块C++图像的基本运算

    图像处理中,理解图像的基本操作是掌握计算机视觉技术的关键。本文章将介绍 基于LockAI视觉识别
    发表于 05-06 16:56

    基于LockAI视觉识别模块C++使用图像的统计信息

    图像处理中,统计信息可以帮助我们了解图像的特性,例如区域内的像素分布、颜色转换以及特定区域的分析。本文将介绍基于LockAI视觉识别
    发表于 05-08 10:31

    基于LockAI视觉识别模块C++二维码识别

    二维码识别视觉模块经常使用到的功能之一。我们将演示如何使用基于瑞芯微RV1106的LockAI视觉识别
    发表于 05-26 09:57

    基于LockAI视觉识别模块C++条码识别

    条码识别视觉模块经常使用到的功能之一,经常用于识别超市的货物信息。本文我们将演示如何基于瑞芯微RV1106的LockAI
    发表于 05-27 10:26

    基于LockAI视觉识别模块C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。 本文档展示了如何使用 lockzhiner_v
    发表于 06-06 14:43

    基于LockAI视觉识别模块:手写数字识别

    手写数字识别是一种经典的模式识别图像处理问题,旨在通过计算机自动识别用户手写的数字。 本文将教会你如何使用基于RV1106的 LockAI
    发表于 06-30 16:45

    基于LockAI视觉识别模块C++人脸识别

    本文基于RV1106做成的LockAI视觉识别模块,采用 LZ-Picodet 模型训练的人脸检测模型 LZ-Face,以及ArcFace人脸识别
    发表于 07-01 12:01

    基于LockAI视觉识别模块C++图像采集例程

    本文主要演示如何使用LockAI视觉识别模块进行视频流的读取,同时使用Edit模块进行图像传输。
    的头像 发表于 04-30 18:23 548次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b><b class='flag-5'>图像</b>采集例程

    基于LockAI视觉识别模块C++使用图像的统计信息

    图像处理中,统计信息可以帮助我们了解图像的特性,例如区域内的像素分布、颜色转换以及特定区域的分析。本文将介绍基于LockAI视觉识别
    的头像 发表于 05-08 10:09 551次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b>使用<b class='flag-5'>图像</b>的统计信息

    基于LockAI视觉识别模块C++二维码识别

    二维码识别视觉模块经常使用到的功能之一。我们将演示如何使用基于瑞芯微RV1106的LockAI视觉识别
    的头像 发表于 05-26 09:42 691次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b>二维码<b class='flag-5'>识别</b>

    基于LockAI视觉识别模块C++条码识别

    条码识别视觉模块经常使用到的功能之一,经常用于识别超市的货物信息。本文我们将演示如何基于瑞芯微RV1106的LockAI
    的头像 发表于 05-27 09:32 509次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b>条码<b class='flag-5'>识别</b>

    基于LockAI视觉识别模块C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。本文档展示了如何使用lockzhiner_vis
    的头像 发表于 06-06 13:56 603次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b>目标检测

    基于LockAI视觉识别模块:手写数字识别

    手写数字识别是一种经典的模式识别图像处理问题,旨在通过计算机自动识别用户手写的数字。本文将教会你如何使用基于RV1106的LockAI
    的头像 发表于 06-30 15:44 844次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:手写数字<b class='flag-5'>识别</b>

    基于LockAI视觉识别模块C++人脸识别

    本文基于RV1106做成的LockAI视觉识别模块,采用LZ-Picodet模型训练的人脸检测模型LZ-Face,以及ArcFace人脸识别
    的头像 发表于 07-01 10:09 504次阅读
    基于<b class='flag-5'>LockAI</b><b class='flag-5'>视觉</b><b class='flag-5'>识别</b><b class='flag-5'>模块</b>:<b class='flag-5'>C++</b>人脸<b class='flag-5'>识别</b>