Быстрый способ сделать это - использовать функцию cv::reduce
OpenCv и найти максимальное значение для каждого столбца. Это быстрее, чем составление суммы элементов. Если максимальное значение в столбце равно 0, это означает, что столбец черный.
Ввод cv::reduce
является 2-мерным массивом:
[a b c]
[d e f]
[g h i]
, поскольку на выходе будет получена матрица 2d с одной строкой - vector.
[max(a,d,g) max(b,e,h) max(c,f,i)]
Затем вам нужно найти индекс cutOff - первый не черный столбец и извлечь ROI:
cv::Mat img = imread("test.jpg");
cv::Mat out;
cv::reduce(img, out, 0, cv::REDUCE_MAX);
int cutOffIdx = 0;
for (int col = 0; col < out.cols; ++col) {
const cv::Vec3b& vec = out.at<Vec3b>(0, col);
if (vec[0] || vec[1] || vec[2]) {
cutOffIdx = col;
break;
}
}
cv::imshow("test",img(cv::Rect(cutOffIdx,0,img.cols-cutOffIdx-1,img.rows)));
cv::waitKey(0);