OpenCV 图形API(21)逐像素操作

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

在OpenCV的G-API模块中,逐像素操作指的是对图像中的每个像素单独进行处理的操作。这些操作可以通过G-API的计算图(Graph API)来高效地执行。G-API提供了一系列用于实现各种图像处理任务的函数,如算术运算、逻辑运算和其他像素级别的变换。

相关函数

以下是关于Graph API中逐像素操作的一些说明和示例:

  • 算术运算:包括加法、减法、乘法、除法等,例如cv::gapi::add、cv::gapi::sub、cv::gapi::mul、cv::gapi::div。

  • 逻辑运算:如与、或、非、异或等操作,适用于二值图像处理,例如cv::gapi::bitwise_and、cv::gapi::bitwise_or等。

  • 其他变换:还包括一些其他的像素级变换,如绝对差值(cv::gapi::absdiff)、位移(cv::gapi::shift)等。

通过使用G-API,你可以构建一个计算图,该图定义了数据如何流动以及各个操作如何串联起来以完成复杂的图像处理任务。这种方法不仅提高了代码的可读性,还能够利用优化后的后端实现加速计算过程。

按位与操作cv::gapi::bitwise_and

cv::gapi::bitwise_and 是 OpenCV G-API 模块中的一个函数,用于执行两个矩阵(图像)之间的逐像素按位与操作。这个操作对于每个对应的像素点,将 src1 和 src2 的像素值进行按位与运算,并将结果存储在输出矩阵中。

  • 对于浮点型矩阵,将使用其特定于机器的位表示(通常是符合 IEEE754 标准的)进行操作。
  • 对于多通道矩阵,每个通道将独立处理。
  • 输出矩阵必须具有与输入矩阵相同的尺寸和深度。

支持的矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.bitwise_and”

函数原型
GMat cv::gapi::bitwise_and 	
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );// 定义G-API计算图cv::GComputation bitwiseAndComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::bitwise_and( in1, in2 );  // 计算逐像素按位与return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图bitwiseAndComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise bitwise AND result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise bitwise AND result: 
[  1,   0,   3;4,   5,   4;3,   0,   1]

按位非操作函数bitwise_not()

反转数组的每一位。
该函数 bitwise_not 计算输入矩阵每个元素的按位取反:
dst ( I ) = ¬ src ( I ) \texttt{dst} (I) = \neg \texttt{src} (I) dst(I)=¬src(I)
对于浮点数矩阵,将使用其特定于机器的位表示(通常是符合 IEEE754 标准的)进行操作。对于多通道矩阵,每个通道将独立处理。输出矩阵必须与输入矩阵具有相同的尺寸和深度。

支持的矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.bitwise_not”

函数原型
GMat cv::gapi::bitwise_not 
(const GMat &src
) 	
参数:
  • 参数src: 输入矩阵。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );// 定义G-API计算图cv::GComputation bitwiseNotComp( []() {cv::GMat in;cv::GMat out = cv::gapi::bitwise_not( in );  // 计算逐像素按位取反return cv::GComputation( cv::GIn( in ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图bitwiseNotComp.apply( cv::gin( src ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise bitwise NOT result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise bitwise NOT result: 
[254, 253, 252;251, 250, 249;248, 247, 246]

按位或操作函数bitwise_or()

计算两个矩阵(src1 | src2)的逐元素按位逻辑或。
该函数计算两个相同大小矩阵的每个元素的按位逻辑或:

  • 对于浮点数矩阵,将使用其特定于机器的位表示(通常是符合 IEEE754 标准的)进行操作。
  • 对于多通道矩阵,每个通道将独立处理。
  • 输出矩阵必须具有与输入矩阵相同的尺寸和深度。

支持的矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.bitwise_or”

函数原型
GMat cv::gapi::bitwise_or 	
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • src1: 第一个输入矩阵。
  • src2: 第二个输入矩阵。
示例代码
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );// 定义G-API计算图cv::GComputation bitwiseOrComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::bitwise_or( in1, in2 );  // 计算逐像素按位或return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图bitwiseOrComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise bitwise OR result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise bitwise OR result: 
[  9,  10,   7;6,   5,   6;7,  10,   9]

按位异或操作函数bitwise_xor()

计算两个矩阵(src1 ^ src2)的逐元素按位逻辑“异或”。

该函数计算两个相同大小矩阵的每个元素的按位逻辑“异或”:

  • 对于浮点数矩阵,将使用其特定于机器的位表示(通常是符合 IEEE754 标准的)进行操作。
  • 对于多通道矩阵,每个通道将独立处理。
  • 输出矩阵必须具有与输入矩阵相同的尺寸和深度。

支持的矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.bitwise_xor”

函数原型
GMat cv::gapi::bitwise_xor 
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数 src2: 第二个输入矩阵。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );// 定义G-API计算图cv::GComputation bitwiseXorComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::bitwise_xor( in1, in2 );  // 计算逐像素按位异或return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图bitwiseXorComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise bitwise XOR result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise bitwise XOR result: 
[  8,  10,   4;2,   0,   2;4,  10,   8]

相等比较操作函数cmpEQ()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否等于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:
dst ( I ) = src1 ( I ) = = src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) == \texttt{src2} (I) dst(I)=src1(I)==src2(I)
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。
支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpEQ”

函数原型
GMat cv::gapi::cmpEQ 
(const GMat &  	src1,const GMat &  	src2 
) 		
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 0, 6, 7, 8, 9 );// 定义G-API计算图cv::GComputation cmpEQComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpEQ( in1, in2 );  // 计算逐像素相等性比较return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图cmpEQComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise equality comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise equality comparison result: 
[255, 255, 255;255,   0, 255;255, 255, 255]

“大于等于”比较操作函数cmpGE()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否大于或等于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:
dst ( I ) = src1 ( I ) > = src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) >= \texttt{src2} (I) dst(I)=src1(I)>=src2(I)
当比较结果为真时,输出数组中相应位置的元素被设置为 255。比较操作可以用等效的矩阵表达式替换:
dst = src1 > = src2 \texttt{dst} = \texttt{src1} >= \texttt{src2} dst=src1>=src2
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。

支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpGE”

函数原型
GMat cv::gapi::cmpGE 	
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数 src1: 第一个输入矩阵。
  • 参数 src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 5, 5, 5, 5, 5, 5, 5, 5, 5 );// 定义G-API计算图cv::GComputation cmpGEComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpGE( in1, in2 );  // 计算逐像素“大于等于”比较return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图cmpGEComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise greater or equal comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise greater or equal comparison result: 
[255, 255, 255;255, 255,   0;0,   0,   0]

“大于”比较操作函数cmpGT()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否大于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:

dst ( I ) = src1 ( I ) > src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) > \texttt{src2} (I) dst(I)=src1(I)>src2(I)
当比较结果为真时,输出数组中相应位置的元素被设置为 255。比较操作可以用等效的矩阵表达式替换:
dst = src1 > src2 \texttt{dst} = \texttt{src1} > \texttt{src2} dst=src1>src2
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。

支持的输入矩阵数据类型包括:CV_8UC1, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpGT”

函数原型
GMat cv::gapi::cmpGT 
(const GMat &  	src1,const GMat &  	src2 
) 	
参数
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 5, 5, 5, 5, 5, 5, 5, 5, 5 );// 定义G-API计算图cv::GComputation cmpGTComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpGT( in1, in2 );  // 计算逐像素“大于”比较return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图cmpGTComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise greater than comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise greater than comparison result: 
[255, 255, 255;255,   0,   0;0,   0,   0]

小于等于”比较操作函数cmpLE()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否小于或等于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:
dst ( I ) = src1 ( I ) < = src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) <= \texttt{src2} (I) dst(I)=src1(I)<=src2(I)
当比较结果为真时,输出数组中相应位置的元素被设置为 255;否则为 0。比较操作可以用等效的矩阵表达式替换:
dst = src1 < = src2 \texttt{dst} = \texttt{src1} <= \texttt{src2} dst=src1<=src2
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。

支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpLE”

函数原型
GMat cv::gapi::cmpLE 	
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 5, 5, 5, 5, 5, 5, 5, 5, 5 );// 定义G-API计算图cv::GComputation cmpLEComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpLE( in1, in2 );  // 计算逐像素“小于等于”比较return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图cmpLEComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise less or equal comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise less or equal comparison result: 
[255, 255, 255;255, 255,   0;0,   0,   0]

“小于”比较操作函数cmpLT()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否小于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:

dst ( I ) = src1 ( I ) < src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) < \texttt{src2} (I) dst(I)=src1(I)<src2(I)
当比较结果为真时,输出数组中相应位置的元素被设置为 255;否则为 0。比较操作可以用等效的矩阵表达式替换:
dst = src1 < src2 \texttt{dst} = \texttt{src1} < \texttt{src2} dst=src1<src2
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。

支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpLT”

函数原型
GMat cv::gapi::cmpLT
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>int main()
{// 创建示例输入矩阵cv::Mat src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );cv::Mat src2 = ( cv::Mat_< uchar >( 3, 3 ) << 5, 5, 5, 5, 5, 5, 5, 5, 5 );// 定义G-API计算图cv::GComputation cmpLTComp( []() {cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpLT( in1, in2 );  // 计算逐像素“小于”比较return cv::GComputation( cv::GIn( in1, in2 ), cv::GOut( out ) );} );// 输出矩阵cv::Mat dst;// 执行计算图cmpLTComp.apply( cv::gin( src1, src2 ), cv::gout( dst ) );// 打印结果std::cout << "Element-wise less than comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise less than comparison result: 
[255, 255, 255;255,   0,   0;0,   0,   0]

“不等于”比较操作函数cmpNE()

对两个矩阵进行逐元素比较,检查第一个矩阵中的元素是否不等于第二个矩阵中的元素。

该函数比较两个相同大小的矩阵 src1 和 src2 的元素:
dst ( I ) = src1 ( I ) ! = src2 ( I ) \texttt{dst} (I) = \texttt{src1} (I) != \texttt{src2} (I) dst(I)=src1(I)!=src2(I)
当比较结果为真时,输出数组中相应位置的元素被设置为 255;否则为 0。比较操作可以用等效的矩阵表达式替换:
dst = src1 ! = src2 \texttt{dst} = \texttt{src1} != \texttt{src2} dst=src1!=src2
输出矩阵的深度必须是 CV_8U,并且必须与输入矩阵具有相同的尺寸和通道数。

支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.compare.cmpNE”

函数原型
GMat cv::gapi::cmpNE 	
(const GMat &  	src1,const GMat &  	src2 
) 	
参数:
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵或标量,其深度应与第一个输入矩阵相同。
代码示例
#include <opencv2/opencv.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>int main() {// 创建示例输入矩阵cv::Mat src1 = (cv::Mat_<uchar>(3, 3) << 1, 2, 3,4, 5, 6,7, 8, 9);cv::Mat src2 = (cv::Mat_<uchar>(3, 3) << 5, 5, 5,5, 5, 5,5, 5, 5);// 定义G-API计算图cv::GComputation cmpNEComp([](){cv::GMat in1, in2;cv::GMat out = cv::gapi::cmpNE(in1, in2); // 计算逐像素“不等于”比较return cv::GComputation(cv::GIn(in1, in2), cv::GOut(out));});// 输出矩阵cv::Mat dst;// 执行计算图cmpNEComp.apply(cv::gin(src1, src2), cv::gout(dst));// 打印结果std::cout << "Element-wise not equal comparison result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise not equal comparison result: 
[255, 255, 255;255,   0, 255;255, 255, 255]

基于掩码从两个矩阵中选择元素的函数select()

根据给定的掩码从第一个或第二个输入矩阵中选择值。该函数将输出矩阵设置为:如果掩码矩阵对应位置的值是 255,则采用第一个输入矩阵中的值;如果掩码矩阵对应位置的值是 0,则采用第二个输入矩阵中的值。

输入掩码矩阵必须是 CV_8UC1 类型,其他两个输入矩阵和输出矩阵应具有相同的类型。所有输入和输出矩阵的尺寸应该相同。支持的输入矩阵数据类型包括:CV_8UC1, CV_8UC3, CV_16UC1, CV_16SC1, CV_32FC1。

注意:
该函数的文本ID是 “org.opencv.core.pixelwise.select”

函数原型
GMat cv::gapi::select 
(const GMat &  	src1,const GMat &  	src2,const GMat &  	mask 
) 	
参数
  • 参数src1: 第一个输入矩阵。
  • 参数src2: 第二个输入矩阵。
  • 参数mask: 掩码输入矩阵。
代码示例
#include <opencv2/opencv.hpp>
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>int main() {// 创建示例输入矩阵cv::Mat src1 = (cv::Mat_<uchar>(3, 3) << 1, 2, 3,4, 5, 6,7, 8, 9);cv::Mat src2 = (cv::Mat_<uchar>(3, 3) << 9, 8, 7,6, 5, 4,3, 2, 1);cv::Mat mask = (cv::Mat_<uchar>(3, 3) << 0, 255, 0,255, 0, 255,0, 255, 0);// 定义G-API计算图cv::GComputation selectComp([](){cv::GMat in1, in2, msk;cv::GMat out = cv::gapi::select(in1, in2, msk); // 根据掩码选择元素return cv::GComputation(cv::GIn(in1, in2, msk), cv::GOut(out));});// 输出矩阵cv::Mat dst;// 执行计算图selectComp.apply(cv::gin(src1, src2, mask), cv::gout(dst));// 打印结果std::cout << "Element-wise selection result: \n" << dst << std::endl;return 0;
}
运行结果
Element-wise selection result: 
[  9,   2,   7;4,   5,   6;3,   8,   1]

…………………………………………………………完结………………………………………………………………………………

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

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

相关文章

CubeMX配置STM32VET6实现网口通信(无操作系统版-附源码)

下面是使用CubeMX配置STM32F407VET6,实现以太网通讯(PHY芯片为LAN8720)的具体步骤总结: 一、硬件连接方式: 硬件原理图: 使用外部晶振为PHY芯片提供时钟。 STM32F407VET6 与 LAN8720 采用 RMII 模式连接。STM32F407VET6引脚功能(RMII)LAN8720引脚PA1ETH_REF_CLKREF_CL…

Android Compose 中获取和使用 Context 的完整指南

在 Android Jetpack Compose 中&#xff0c;虽然大多数 UI 组件不再需要直接使用 Context&#xff0c;但有时你仍然需要访问它来执行一些 Android 平台特定的操作。以下是几种在 Compose 中获取和使用 Context 的方法&#xff1a; 1. 使用 LocalContext 这是 Compose 中最常用…

在VMware下Hadoop分布式集群环境的配置--基于Yarn模式的一个Master节点、两个Slaver(Worker)节点的配置

你遇到的大部分ubuntu中配置hadoop的问题这里都有解决方法&#xff01;&#xff01;&#xff01;&#xff08;近10000字&#xff09; 概要 在Docker虚拟容器环境下&#xff0c;进行Hadoop-3.2.2分布式集群环境的配置与安装&#xff0c;完成基于Yarn模式的一个Master节点、两个…

PID灯控算法

根据代码分析&#xff0c;以下是针对PID算法和光敏传感器系统的优化建议&#xff0c;分为算法优化、代码结构优化和系统级优化三部分&#xff1a; 一、PID算法优化 1. 增量式PID 输出平滑 // 修改PID计算函数 uint16_t PID_calculation_fun(void) {if(PID_Str_Val.Tdata >…

文件映射mmap与管道文件

在用户态申请内存&#xff0c;内存内容和磁盘内容建立一一映射 读写内存等价于读写磁盘 支持随机访问 简单来说&#xff0c;把磁盘里的数据与内存的用户态建立一一映射关系&#xff0c;让读写内存等价于读写磁盘&#xff0c;支持随机访问。 管道文件&#xff1a;进程间通信机…

在 Java 中调用 ChatGPT API 并实现流式接收(Server-Sent Events, SSE)

文章目录 简介OkHttp 流式获取 GPT 响应通过 SSE 流式推送前端后端代码消息实体接口接口实现数据推送给前端 前端代码创建 sseClient.jsvue3代码 优化后端代码 简介 用过 ChatGPT 的伙伴应该想过自己通过调用ChatGPT官网提供的接口来实现一个自己的问答机器人&#xff0c;但是…

硬盘分区格式之GPT(GUID Partition Table)笔记250407

硬盘分区格式之GPT&#xff08;GUID Partition Table&#xff09;笔记250407 GPT&#xff08;GUID Partition Table&#xff09;硬盘分区格式详解 GPT&#xff08;GUID Partition Table&#xff09;是替代传统 MBR 的现代分区方案&#xff0c;专为 UEFI&#xff08;统一可扩展固…

Vite环境下解决跨域问题

在 Vite 开发环境中&#xff0c;可以通过配置代理来解决跨域问题。以下是具体步骤&#xff1a; 在项目根目录下找到 vite.config.js 文件&#xff1a;如果没有&#xff0c;则需要创建一个。配置代理&#xff1a;在 vite.config.js 文件中&#xff0c;使用 server.proxy 选项来…

交换机与ARP

交换机与 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09; 的关系主要体现在 局域网&#xff08;LAN&#xff09;内设备通信的地址解析与数据帧转发 过程中。以下是二者的核心关联&#xff1a; 1. 基本角色 交换机&#xff1a;工作在 数据链…

【Spring】小白速通AOP-日志记录Demo

这篇文章我将通过一个最常用的AOP场景-方法调用日志记录&#xff0c;带你彻底理解AOP的使用。例子使用Spring BootSpring AOP实现。 如果对你有帮助可以点个赞和关注。谢谢大家的支持&#xff01;&#xff01; 一、Demo实操步骤&#xff1a; 1.首先添加Maven依赖 <!-- Sp…

git功能点管理

需求&#xff1a; 功能模块1 已经完成&#xff0c;已经提交并推送到远程&#xff0c;准备交给测试。功能模块2 已经完成&#xff0c;但不提交给测试&#xff0c;继续开发。功能模块3 正在开发中。 管理流程&#xff1a; 创建并开发功能模块1&#xff1a; git checkout main…

QGIS实战系列(六):进阶应用篇——Python 脚本自动化与三维可视化

欢迎来到“QGIS实战系列”的第六期!在前几期中,我们从基础操作到插件应用逐步提升了 QGIS 技能。这一篇,我们将迈入进阶领域,探索如何用 Python 脚本实现自动化,以及如何创建三维可视化效果,让你的 GIS 项目更高效、更立体。 第一步:Python 脚本自动化 QGIS 内置了 Py…

高德地图 3D 渲染-区域纹理图添加

引入-初始化地图&#xff08;关键代码&#xff09; // 初始化页面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申请的key值></script>// 添加地图容器 <div idcontainer ></div>// 地图初始化应该…

ffmpeg视频转码相关

ffmpeg视频转码相关 简介参数 实战举栗子获取视频时长视频转码mp4文件转为hls m3u8 ts等文件图片转视频抽取视频第一帧获取基本信息 转码日志输出详解转码耗时测试 简介 FFmpeg 是领先的多媒体框架&#xff0c;能够解码、编码、 转码、复用、解复用、流、过滤和播放 几乎所有人…

【ISP】HDR技术中Sub-Pixel与DOL的对比分析

一、原理对比 Sub-Pixel&#xff08;空间域HDR&#xff09; • 核心机制&#xff1a;在单个像素内集成一大一小两个子像素&#xff08;如LPD和SPD&#xff09;&#xff0c;利用其物理特性差异&#xff08;灵敏度、满阱容量&#xff09;同时捕捉不同动态范围的信号。 ◦ 大像素&…

Vulnhub-IMF靶机

本篇文章旨在为网络安全渗透测试靶机教学。通过阅读本文&#xff0c;读者将能够对渗透Vulnhub系列IMF靶机有一定的了解 一、信息收集阶段 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/imf-1,162/ 因为靶机为本地部署虚拟机网段&#xff0c;查看dhcp地址池设置。得…

Linux内核中TCP协议栈的实现:tcp_close函数的深度剖析

引言 TCP(传输控制协议)作为互联网协议族中的核心协议之一,负责在不可靠的网络层之上提供可靠的、面向连接的字节流服务。Linux内核中的TCP协议栈实现了TCP协议的全部功能,包括连接建立、数据传输、流量控制、拥塞控制以及连接关闭等。本文将深入分析Linux内核中tcp_close…

java+postgresql+swagger-多表关联insert操作(七)

入参为json&#xff0c;然后根据需要对多张表进行操作&#xff1a; 入参格式&#xff1a; [{"custstoreName":"swagger-测试经销商01","customerName":"swagger-测试客户01","propertyNo":"swaggertest01",&quo…

R语言——绘制生命曲线图(细胞因子IL5)

绘制生命曲线图&#xff08;根据细胞因子&#xff09; 说明流程代码加载包读取Excel文件清理数据重命名列名处理IL-5中的"<"符号 - 替换为检测下限的一半首先找出所有包含"<"的值检查缺失移除缺失值根据IL-5中位数将患者分为高低两组 创建生存对象拟…

Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)

Python----计算机视觉处理&#xff08;Opencv:道路检测之道路透视变换) Python----计算机视觉处理&#xff08;Opencv:道路检测之提取车道线&#xff09; Python----计算机视觉处理&#xff08;Opencv:道路检测之车道线拟合&#xff09; Python----计算机视觉处理&#xff0…