在实时视频中仅更改 Mat 的一部分 OpenCV Native C++ Android Studio

Posted

技术标签:

【中文标题】在实时视频中仅更改 Mat 的一部分 OpenCV Native C++ Android Studio【英文标题】:Altering just part of a Mat in real-time video OpenCV Native C++ Android Studio 【发布时间】:2017-02-16 21:13:43 【问题描述】:

我正在尝试使用 android-studio 中的原生 Opencv 代码实时检测人脸,然后在人脸区域周围创建一个新的矩形 Mat 并将配色方案更改为黑白。

我已经成功地改变了整个垫子,除了我想要的盒子,这让我相信我已经接近实现我的目标,但我似乎无法弄清楚我需要对代码。

JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeRGB
    (JNIEnv *jenv, jlong image, jdouble x1, jdouble y1, jdouble x2, jdouble y2)

Mat *img = (Mat*) image;
cvtColor(*img,*img,CV_GRAY2RGB);

Point p1(x1+100,y1+100);
Point p2(x2,y2);
Rect roi(p1, p2);


Mat img_uv;
//Change entire mat to YUV
cvtColor(*img, img_uv, CV_RGB2YUV);

//YUV 3 channels
vector<Mat> channels(3);
split(img_uv, channels);

Mat Y = channels[0];
Mat U = channels[1];
Mat V = channels[2];

Mat mask = Mat::zeros(Y.size(), Y.type());
rectangle(mask, roi, Scalar(1), CV_FILLED);

// merge channels
channels[0] = Y;
channels[1] = U.mul(mask)+(Scalar::all(1)-mask).mul(Y);
channels[2] = V.mul(mask)+(Scalar::all(1)-mask).mul(Y);
Mat img_yuv_out;
merge(channels, img_yuv_out);
cvtColor(img_yuv_out, *img, CV_YUV2RGB);

以上是我使用的JNI方法。 java 代码创建 Mat 并作为 jlong​​ 传递给上述方法。我试图简单地改变面具的颜色如下

cvtColor(mask(roi), mask(roi), CV_RBG2GRAY);

代码执行后,我在 java 代码中重用最初使用的 Mat。非常感谢任何帮助或建议,谢谢!

但这导致程序崩溃。

【问题讨论】:

有点不清楚。所以你要保持内盒(面)是黑白的。垫子的其余部分(外 - 内盒)会发生什么?你也看视频是灰度的吗? 我正在阅读普通 RGB 视频,我的目标是创建一个新的 Mat,它与我的面部区域以任何方式转换的 Mat 相同,就像 @Nejc 图像显示的那样。跨度> @user3160152 我的回答是否涵盖了您想知道的所有内容,还是我遗漏了什么? 嘿,它不起作用,因为我需要将 mat 作为 (Mat *) 从 java 传递给 c++,所以我不能使用 img(roi) :/ @user3160152 - 我更改了代码示例,使其更接近您的代码。你现在可以让它工作吗? :) 【参考方案1】:

这是将图像的一部分转换为灰度的方法:

Mat img = imread("Lenna.png");

Mat *image = &img;

Rect roi = Rect(100, 100, 100, 100);

Mat gray;
cvtColor((*image)(roi), gray, CV_RGB2GRAY);
Mat gray_3ch;
cvtColor(gray, gray_3ch, CV_GRAY2RGB);

gray_3ch.copyTo((*image)(roi));

编辑:为了帮助问题的作者,我在代码示例中用指向 Mat 的指针更改了 Mat。我这样做的唯一原因是为了让他的代码能够正常工作。

【讨论】:

以上是关于在实时视频中仅更改 Mat 的一部分 OpenCV Native C++ Android Studio的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV,Dlib - Mat 对象输出为黑色图像

佳能 LiveView:图像转换为 OpenCV Mat

OpenCV inRange 更改 Mat 类型

Opencv中Mat高效率 左右上下平移一定的像素

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

c ++如何将视频序列放入OpenCV中的vector<Mat>?