OpenCV:如何在 Mask 为白色的地方使 Mat 着色
OpenCV: How do I make a Mat colorized where the Mask is white
我是 OpenCV 的新手,只是在做一个基本的 RGB 滤色器。我通过测试每个像素来做到这一点,但效率很低。所以我尝试了 Core.inRange
,但是 returns 一个面具(黑色和白色),我需要一个彩色的 Mat
。这是我目前拥有的:
// frame is input, out is output
Scalar minValues = new Scalar(RFrom, GFrom, BFrom);
Scalar maxValues = new Scalar(RTo, GTo, BTo);
Mat mask = new Mat();
Core.inRange(frame, minValues, maxValues, mask);
Core.bitwise_and(frame, mask, out);
当我 运行 它时,我得到:
.CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.2) /Users/jason/Projects/openpnp/opencv/opencv/opencv-3.4.2/modules/core/src/arithm.cpp:225: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function 'binary_op'
]
这是因为 inRange
更新的 mask
的类型为 CV_8UC1
但框架的类型为 CV_8UC3
。我该怎么做才能解决这个问题?
我尝试切换 out
和 frame
并使用 frame.copyTo(out, mask)
而不是 Core.bitwise_and(frame, mask, out)
成功了!!
这是我的最终代码:
// frame is input, out is output
Scalar minValues = new Scalar(RFrom, GFrom, BFrom);
Scalar maxValues = new Scalar(RTo, GTo, BTo);
Mat mask = new Mat();
Core.inRange(frame, minValues, maxValues, mask);
frame.copyTo(out, mask);
我是 OpenCV 的新手,只是在做一个基本的 RGB 滤色器。我通过测试每个像素来做到这一点,但效率很低。所以我尝试了 Core.inRange
,但是 returns 一个面具(黑色和白色),我需要一个彩色的 Mat
。这是我目前拥有的:
// frame is input, out is output
Scalar minValues = new Scalar(RFrom, GFrom, BFrom);
Scalar maxValues = new Scalar(RTo, GTo, BTo);
Mat mask = new Mat();
Core.inRange(frame, minValues, maxValues, mask);
Core.bitwise_and(frame, mask, out);
当我 运行 它时,我得到:
.CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.2) /Users/jason/Projects/openpnp/opencv/opencv/opencv-3.4.2/modules/core/src/arithm.cpp:225: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function 'binary_op' ]
这是因为 inRange
更新的 mask
的类型为 CV_8UC1
但框架的类型为 CV_8UC3
。我该怎么做才能解决这个问题?
我尝试切换 out
和 frame
并使用 frame.copyTo(out, mask)
而不是 Core.bitwise_and(frame, mask, out)
成功了!!
这是我的最终代码:
// frame is input, out is output
Scalar minValues = new Scalar(RFrom, GFrom, BFrom);
Scalar maxValues = new Scalar(RTo, GTo, BTo);
Mat mask = new Mat();
Core.inRange(frame, minValues, maxValues, mask);
frame.copyTo(out, mask);