Android Bitmap 与 iOS UIImage 各自转换成 CV::Mat 后会有颜色空间(color space)不一样的问题。Android -> RGBA, iOS -> BGRA,为了方便处理,将双端 Mat 转换成同一颜色空间处理。
cv::Mat space_app2bgr(const cv::Mat &appMat) {
CV_Assert(appMat.type() == CV_8UC1 || appMat.type() == CV_8UC3 || appMat.type() == CV_8UC4);
cv::Mat bgrMat;
if (appMat.type() == CV_8UC4) {
#if defined(__ANDROID__)
cv::cvtColor(appMat, bgrMat, cv::COLOR_RGBA2BGR);
#else
cv::cvtColor(appMat, bgrMat, cv::COLOR_BGRA2BGR);
#endif
}
#if defined(__ANDROID__)
else if (appMat.type() == CV_8UC3) {
cv::cvtColor(appMat, bgrMat, cv::COLOR_RGB2BGR);
}
#endif
else {
bgrMat = appMat.clone();
}
return bgrMat;
}
cv::Mat space_bgr2app(const cv::Mat &bgrMat, int type) {
CV_Assert(type == CV_8UC1 || type == CV_8UC3 || type == CV_8UC4);
cv::Mat appMat;
if (type == CV_8UC4) {
#if defined(__ANDROID__)
cv::cvtColor(bgrMat, appMat, cv::COLOR_BGR2RGBA);
#else
cv::cvtColor(bgrMat, appMat, cv::COLOR_BGR2BGRA);
#endif
}
#if defined(__ANDROID__)
else if (type == CV_8UC3) {
cv::cvtColor(bgrMat, appMat, cv::COLOR_BGR2RGB);
}
#endif
else {
appMat = bgrMat.clone();
}
return appMat;
}