Mat中的一些函数(core.cpp)

//! swaps two matrices  交换矩阵 
CV_EXPORTS void swap(Mat& a, Mat& b); 

//! converts array (CvMat or IplImage) to cv::Mat 
将CvMat或者IplImage装换为Mat 
CV_EXPORTS Mat cvarrToMat(const CvArr* arr, bool copyData=false, 
                          bool allowND=true, int coiMode=0); 


//! extracts Channel of Interest from CvMat or IplImage and makes cv::Mat out of it. 
提取CvMat或者IplImage中的感兴趣通道,并以Mat输出 
CV_EXPORTS void extractImageCOI(const CvArr* arr, OutputArray coiimg, int coi=-1); 


//! inserts single-channel cv::Mat into a multi-channel CvMat or IplImage 
将单通道Mat插入CvMat或者IplImage中 
CV_EXPORTS void insertImageCOI(InputArray coiimg, CvArr* arr, int coi=-1); 


//! adds one matrix to another (dst = src1 + src2) 
两矩阵相加 
CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst, 
                      InputArray mask=noArray(), int dtype=-1); 


//! subtracts one matrix from another (dst = src1 - src2) 
两矩阵相减 
CV_EXPORTS_W void subtract(InputArray src1, InputArray src2, OutputArray dst,
                           InputArray mask=noArray(), int dtype=-1); 

//! computes element-wise weighted product of the two arrays (dst = scale*src1*src2) 
计算两矩阵的加权积,权值默认为1 
CV_EXPORTS_W void multiply(InputArray src1, InputArray src2, 
                           OutputArray dst, double scale=1, int dtype=-1); 

//! computes element-wise weighted quotient of the two arrays (dst = scale*src1/src2) 
计算两矩阵的加权商,权值默认为1 
CV_EXPORTS_W void divide(InputArray src1, InputArray src2, OutputArray dst, 
                         double scale=1, int dtype=-1); 

//! computes element-wise weighted reciprocal of an array (dst = scale/src2) 
计算加权倒数,权值默认为1 
CV_EXPORTS_W void divide(double scale, InputArray src2, 
                         OutputArray dst, int dtype=-1); 

//! computes sum of array elements 
计算矩阵内所有元素总和 
CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src); 

//! computes the number of nonzero array elements 
计算矩阵内非零元素个数 
CV_EXPORTS_W int countNonZero( InputArray src ); 

//! computes mean value of selected array elements 
计算所选矩阵的均值 
CV_EXPORTS_W Scalar mean(InputArray src, InputArray mask=noArray()); 

//! computes mean value and standard deviation of all or selected array elements
计算所选矩阵的矩阵和标准差 
CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, 
                             InputArray mask=noArray()); 


//! finds global minimum and maximum array elements and returns their values and their locations 
寻找全局最小值和最大值,返回其值与位置 
CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, 
                           CV_OUT double* maxVal=0, CV_OUT Point* minLoc=0, 
                           CV_OUT Point* maxLoc=0, InputArray mask=noArray()); 
CV_EXPORTS void minMaxIdx(InputArray src, double* minVal, double* maxVal, 
                          int* minIdx=0, int* maxIdx=0, InputArray mask=noArray()); 

//! computes square root of each matrix element (dst = src**0.5) 
计算矩阵中每个元素的平方根 
CV_EXPORTS_W void sqrt(InputArray src, OutputArray dst); 


//! computes exponent of each matrix element (dst = e**src) 
CV_EXPORTS_W void exp(InputArray src, OutputArray dst); 
//! computes natural logarithm of absolute value of each matrix element: dst = log(abs(src)) 
计算自然对数 
CV_EXPORTS_W void log(InputArray src, OutputArray dst); 
//! computes cube root of the argument 
计算立方根 
CV_EXPORTS_W float cubeRoot(float val); 


//! adds scaled array to another one (dst = alpha*src1 + src2) 
CV_EXPORTS_W void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst); 

//! computes weighted sum of two arrays (dst = alpha*src1 + beta*src2 + gamma) 
计算两矩阵的加权和权值默认为1 
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, 
                              double beta, double gamma, OutputArray dst, int dtype=-1); 

//! scales array elements, computes absolute values and converts the results to 8-bit unsigned integers: 
扫描矩阵元素,计算绝对值并转为8位无符号整型 
dst(i)=saturate_cast<uchar>abs(src(i)*alpha+beta) 
CV_EXPORTS_W void convertScaleAbs(InputArray src, OutputArray dst, 
                                  double alpha=1, double beta=0); 
//! transforms array of numbers using a lookup table: dst(i)=lut(src(i)) 
CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst, 
                      int interpolation=0); 


<------------------------------------------------------------模糊处理以及腐蚀和膨胀--------------------------------------------------------------
应用:
      imshow("原图",image); 
    GaussianBlur(image,image,Size(5,5),1.5); 
    imshow("高斯滤波",image); 

    Mat eroded;//形态学处理,腐蚀 
    erode(image,eroded,Mat()); 
    Mat dilated;//形态学处理,膨胀 
    dilate(image,dilated,Mat()); 

原函数参数:
GaussianBlur( InputArray src, 
                                               OutputArray dst, Size ksize, 
                                               double sigmaX, double sigmaY=0, 
                                               int borderType=BORDER_DEFAULT ); 
高斯滤波: 
src--输入矩阵 
dst--输出矩阵 
Size(w,h)--滤波核大小 
sigmaX--X轴向标准偏差,为0表示sigmaX由滤波核计算所得 
sigmaY--Y轴向标准偏差,为0表示sigmaY由滤波核计算所得 

erode( InputArray src, OutputArray dst, InputArray kernel, 
                         Point anchor=Point(-1,-1), int iterations=1, 
                         int borderType=BORDER_CONSTANT, 
                         const Scalar& borderValue=morphologyDefaultBorderValue() ); 
腐蚀: 
src--输入矩阵 
dst--输出矩阵 
kernel--输入核,默认3x3矩阵( If element=Mat() , a 3 x 3 rectangular structuring element is used.),如需特别指定,需使用Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1)), anchor=Point(-1,-1)表示定点设为核中心。 iterations--表示迭代次数,这里默认为1表示只迭代一次 
  • borderType – Pixel extrapolation method. See borderInterpolate() for details.
  • borderValue – Border value in case of a constant border. The default value has a special meaning. See createMorphologyFilter() for details.


dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor=Point(-1,-1), int iterations=1,
                          int borderType=BORDER_CONSTANT,
                          const Scalar& borderValue=morphologyDefaultBorderValue() );

膨胀:

src--输入矩阵
dst--输出矩阵
kernel--输入核,默认3x3矩阵( If element=Mat() , a 3 x 3 rectangular structuring element is used.),如需特别指定,需使用Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1)),anchor=Point(-1,-1)表示定点设为核中心。 iterations--表示迭代次数,这里默认为1表示只迭代一次


--------------------------------------------------------------------------------------------------------------------------------------------------->
很抱歉,我无法提供完整程序并包含注释。但是,我可以为您提供一个简单的示例程序,帮助您开始使用opencv函数Mat通过rk_mpi.h库Mppenccfg编码成h264格式转换。 首先,您需要确保已经安装了OpenCV和rk_mpi.h库。然后,您需要创建一个名为“encode.cpp”的文件,并将以下代码复制到其: ```c++ #include <iostream> #include <opencv2/opencv.hpp> #include "rk_mpi.h" int main() { // 读取视频文件 cv::VideoCapture cap("test.mp4"); if (!cap.isOpened()) { std::cerr << "Failed to open video file!" << std::endl; return -1; } // 创建编码器 MppCtx ctx; MppApi *mpi; MppEncCfg cfg; MppFrame frame; MppPacket pkt; RK_U32 width = 1920; RK_U32 height = 1080; RK_U32 fps = 30; MPP_RET ret = mpp_create(&ctx, &mpi); if (ret != MPP_OK) { std::cerr << "Failed to create mpp context!" << std::endl; return -1; } ret = mpp_init(ctx, MPP_CTX_ENC, MPP_VIDEO_CodingAVC); if (ret != MPP_OK) { std::cerr << "Failed to init encoder!" << std::endl; return -1; } ret = mpp_enc_cfg_init(&cfg, MPP_CTX_ENC); if (ret != MPP_OK) { std::cerr << "Failed to init encoder cfg!" << std::endl; return -1; } cfg->prep.width = width; cfg->prep.height = height; cfg->prep.fps_in = fps; cfg->prep.fps_out = fps; cfg->prep.format = MPP_FMT_YUV420SP; ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); if (ret != MPP_OK) { std::cerr << "Failed to set encoder cfg!" << std::endl; return -1; } ret = mpi->control(ctx, MPP_ENC_GET_CFG, cfg); if (ret != MPP_OK) { std::cerr << "Failed to get encoder cfg!" << std::endl; return -1; } ret = mpp_frame_init(&frame); if (ret != MPP_OK) { std::cerr << "Failed to init frame!" << std::endl; return -1; } frame->width = width; frame->height = height; frame->fmt = MPP_FMT_YUV420SP; ret = mpp_frame_set_hor_stride(frame, MPP_ALIGN(width, 16)); if (ret != MPP_OK) { std::cerr << "Failed to set frame hor stride!" << std::endl; return -1; } ret = mpp_frame_set_ver_stride(frame, MPP_ALIGN(height, 16)); if (ret != MPP_OK) { std::cerr << "Failed to set frame ver stride!" << std::endl; return -1; } ret = mpp_frame_set_pts(frame, 0); if (ret != MPP_OK) { std::cerr << "Failed to set frame pts!" << std::endl; return -1; } ret = mpp_packet_init(&pkt, NULL, 0); if (ret != MPP_OK) { std::cerr << "Failed to init packet!" << std::endl; return -1; } // 编码每一帧并写入文件 while (true) { cv::Mat img; cap >> img; if (img.empty()) { break; } cv::Mat yuv; cv::cvtColor(img, yuv, cv::COLOR_BGR2YUV_I420); memcpy((void*)MPP_BUFFER_PTR(frame->buf), yuv.data, width * height * 3 / 2); ret = mpi->encode_put_frame(ctx, frame, NULL); if (ret != MPP_OK) { std::cerr << "Failed to put frame!" << std::endl; return -1; } ret = mpi->encode_get_packet(ctx, &pkt); if (ret != MPP_OK) { std::cerr << "Failed to get packet!" << std::endl; return -1; } // 写入文件 fwrite(pkt->data, 1, pkt->length, stdout); mpp_packet_deinit(&pkt); } // 清理资源 mpp_frame_deinit(&frame); mpp_enc_cfg_deinit(cfg); mpp_destroy(ctx); return 0; } ``` 在代码,我们首先读取了名为“test.mp4”的视频文件。然后,我们创建了一个编码器,并设置了编码器的参数,例如分辨率和帧率。接下来,我们循环读取每一帧视频,并使用OpenCV将其转换为YUV格式。然后,我们将YUV数据放入编码器进行编码,并将编码后的数据写入文件。最后,我们清理了所有资源。 请注意,由于代码涉及到文件I/O和编解码操作,因此您需要在Linux系统上运行此程序,并使用以下命令编译程序: ``` g++ encode.cpp -o encode -lopencv_core -lopencv_highgui -lmpp -L/path/to/rk_mpi/lib -I/path/to/rk_mpi/include ``` 其,/path/to/rk_mpi是您安装rk_mpi.h库的路径。 希望这个简单的示例程序可以帮助您开始使用OpenCV和rk_mpi.h库进行H.264编码!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值