Я работаю над проектом opencv, в котором используется функция morphologyex. Теперь я пытаюсь сделать это с поддержкой GPU.
Когда я компилирую свою программу с поддержкой opencv 3.0 и cuda 7.5, она принимает большинство функций (таких как cuda::threshold, cuda::cvtcolor и т. д.), кроме morphologyEx. Обратите внимание, что morphologyex вызывается в opencv 2.4.9 как gpu::morphologyEx.
Как я могу использовать эту функцию в OpenCV 3.0 или 3.1? Если она не поддерживается, есть ли альтернатива этой функции?
На самом деле я использую эту функцию для определения фона при неравномерном освещении. Я добавляю код к вопросу. Пожалуйста, предложите мне, как я могу заменить функцию morphologyEx.
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
// Step 1: Read Image
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);
// Step 2: Use Morphological Opening to Estimate the Background
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(15,15));
Mat1b background;
morphologyEx(img, background, MORPH_OPEN, kernel);
// Step 3: Subtract the Background Image from the Original Image
Mat1b img2;
absdiff(img, background, img2);
// Step 4: Increase the Image Contrast
// Don't needed it here, the equivalent would be cv::equalizeHist
// Step 5(1): Threshold the Image
Mat1b bw;
threshold(img2, bw, 50, 255, THRESH_BINARY);
// Step 6: Identify Objects in the Image
vector<vector<Point>> contours;
findContours(bw.clone(), contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
for(int i=0; i<contours.size(); ++i)
{
// Step 5(2): bwareaopen
if(contours[i].size() > 50)
{
// Step 7: Examine One Object
Mat1b object(bw.size(), uchar(0));
drawContours(object, contours, i, Scalar(255), CV_FILLED);
imshow("Single Object", object);
waitKey();
}
}
return 0;
}
================================================== ======================= Спасибо @Roy Falk Прочитав ценные комментарии и документацию, я почувствовал, что функция morphologyEX
morphologyEx(img, background, MORPH_OPEN, kernel);
можно заменить на
cv::Ptr<cv::cuda::Filter>morph = cuda::createMorphologyFilter(MORPH_OPEN, out.type(), kernel);
morph->apply(out, bc);
не стесняйтесь сказать, если я ошибаюсь