Opencv 常用方法

主要是处理
二维数组和cv::mat得相互转换

opencv中cv::Mat就是一个holder memory得对象, 支持ref count。
如需要copy, 则需要clone, 直接赋值只是增加了holder 内部得ref count;
如果api 支持in-place, 则src/out可以是同一个mat, 否则讲src 作为out, src得data holder memory 会被reset;

BGR CPU 转NV21 方法:

 void bgr2yuvnv21(const unsigned char *__restrict__ src,
                                unsigned char *__restrict__ dst, int image_width,
                                int image_height) {
            int nv21_len = image_width * image_height;
            int y, u, v;
            for (int i = 0; i < image_height; i++) {
                for (int j = 0; j < image_width; j++) {
                    int curIndex = i * image_width + j;
                    int currentB = src[curIndex * 3 + 0];
                    int currentG = src[curIndex * 3 + 1];
                    int currentR = src[curIndex * 3 + 2];

                    y = ((77 * currentR + 150 * currentG + 29 * currentB + 128) >> 8) + 0;
                    u = ((-43 * currentR - 84 * currentG + 127 * currentB + 128) >> 8) + 128;
                    v = ((127 * currentR - 106 * currentG - 21 * currentB + 128) >> 8) + 128;

                    dst[i * image_width + j] = (uint8_t) clamp(y, 0, 255);
                    dst[nv21_len + (i >> 1) * image_width + (j & ~1) + 0] = (uint8_t) clamp(v, 0, 255);
                    dst[nv21_len + (i >> 1) * image_width + (j & ~1) + 1] = (uint8_t) clamp(u, 0, 255);
                }
            }
        }

使用opencv 在绘制矩形

//使用cv::imread或是直接实例化一个mat
          cv::Mat mask(size, CV_8UC3,cv::Scalar(0,0,0));
//绘制矩形, FILLED
            cv::rectangle(mask, lt, rb, cv::Scalar(255, 255, 255), cv::LineTypes::FILLED, 4, 0);
//将其转为灰度, 8UC1
            cv::Mat out_mask(size, CV_8UC1);
            cv::cvtColor(mask, out_mask, cv::COLOR_RGB2GRAY);

Opencv 生成随机噪声

cv::Mat img = cv::Mat::zeros(size, CV_8UC4);
            cv::randu(img, cv::Scalar::all(0), cv::Scalar::all(255));

Opencv 讲YUV 转成BGR

//NV21,420SP格式
 cv::Mat out_data(height * 1.5, width, CV_8UC1, yuv_data.get());
                        cv::Mat rgb_out;
                        cv::cvtColor(out_data, rgb_out, cv::COLOR_YUV2BGR_NV21);
                        cv::imwrite(outFilename.str().c_str(), rgb_out);

Opencv 将Y UV 分离格式转为BGR

            cv::Mat yuv_data(height * 1.5, width, CV_8UC1);
            cv::Mat y_data(height, width, CV_8UC1, input_frame.buffer.data.get());
            cv::Mat uv_data(height * 0.5f, width, CV_8UC1,
                            input_frame.buffer.data.get() + width * height);
            cv::Mat input[] = {y_data, uv_data};
            cv::vconcat(input, 2, yuv_data);
            cv::cvtColor(yuv_data, result, cv::COLOR_YUV2BGR_NV21);

About: kiah


发表评论

电子邮件地址不会被公开。