Tips of Migrating Numpy to C++ by OpenCV
About 1 minNumpy to C++cv::Mat
Sigmoid
A sigmoid function is a mathematical function having a characteristic "S"-shaped curve or sigmoid curve.
From wikipedia: Sigmoid_function
It's formula:
We can implement sigmoid function with python and numpy like this:
import numpy as np
z = 1/(1 + np.exp(-x))
Now let's implement it in OpenCV with cpp. Suppose we've got a output from a neural network as a [1, h, w] cv::Mat named pred
. We then do something like pred = sigmoid(pred)
.
cv::Mat sigmoid(const cv::Mat& pred)
{
cv::Mat z;
cv::exp(-pred, z);
z = 1.f/(1.f+z);
return z;
}
Done. Simple. 😊
Channels split and merge
In numpy or other numpy like apis, we can do a slice operation like this,
temp = preds[:2, :, :]
This operation will create a snap shot variable of the first two channels. In OpenCV, we can simulate the operations through channels split and merge.
std::vector<cv::Mat> preds_split;
cv::split(preds, preds_split);
// assert(preds_channels.size() == preds.channels())
std::vector<cv::Mat> preds_temp = {preds_split[0], preds_split[1]};
cv::Mat temp;
cv::merge(preds_temp, temp);
Conditioning Filter Elements of Numpy matrice
Suppose we have a numpy 2d array, which the first channel is the score map of input image. Now we need to filter the pixels greater than the threshold.
pred_score = preds[0] #extract the first channel of preds output
pred_mask = pred_score > min_confidence
The implementation in c++
std::vector<cv::Mat> preds;
cv::split(output, preds);
cv::Mat pred_score = preds[0];
cv::threshold(pred_score, pred_mask, min_confidence, 1.f, cv::THRESH_BINARY);
cv::multiply(pred_mask, 255, pred_mask);
pred_mask.convertTo(pred_mask, CV_8U);