bug fix of "squares" sample for ocl module

pull/18/head
bitwangyaoyao 13 years ago
parent cfdeb50335
commit a091f9e4e2
  1. 19
      samples/ocl/squares.cpp

@ -17,7 +17,7 @@ using namespace std;
void help() void help()
{ {
cout << cout <<
"\nA program using OCL module pyramid scaling, Canny, dilate functions; cpu contours, contour simpification and\n" "\nA program using OCL module pyramid scaling, Canny, dilate functions, threshold, split; cpu contours, contour simpification and\n"
"memory storage (it's got it all folks) to find\n" "memory storage (it's got it all folks) to find\n"
"squares in a list of images pic1-6.png\n" "squares in a list of images pic1-6.png\n"
"Returns sequence of squares detected on the image.\n" "Returns sequence of squares detected on the image.\n"
@ -49,22 +49,20 @@ void findSquares( const Mat& image, vector<vector<Point> >& squares )
{ {
squares.clear(); squares.clear();
Mat pyr, timg, gray0(image.size(), CV_8U), gray; Mat gray;
cv::ocl::oclMat pyr_ocl, timg_ocl, gray0_ocl(gray0), gray_ocl; cv::ocl::oclMat pyr_ocl, timg_ocl, gray0_ocl, gray_ocl;
// down-scale and upscale the image to filter out the noise // down-scale and upscale the image to filter out the noise
ocl::pyrDown(ocl::oclMat(image), pyr_ocl); ocl::pyrDown(ocl::oclMat(image), pyr_ocl);
ocl::pyrUp(pyr_ocl, timg_ocl); ocl::pyrUp(pyr_ocl, timg_ocl);
timg = Mat(timg_ocl);
vector<vector<Point> > contours; vector<vector<Point> > contours;
vector<cv::ocl::oclMat> gray0s;
ocl::split(timg_ocl, gray0s); // split 3 channels into a vector of oclMat
// find squares in every color plane of the image // find squares in every color plane of the image
for( int c = 0; c < 3; c++ ) for( int c = 0; c < 3; c++ )
{ {
int ch[] = {c, 0}; gray0_ocl = gray0s[c];
mixChannels(&timg, 1, &gray0, 1, ch, 1);
// try several threshold levels // try several threshold levels
for( int l = 0; l < N; l++ ) for( int l = 0; l < N; l++ )
{ {
@ -78,14 +76,15 @@ void findSquares( const Mat& image, vector<vector<Point> >& squares )
cv::ocl::Canny(gray0_ocl, gray_ocl, 0, thresh, 5); cv::ocl::Canny(gray0_ocl, gray_ocl, 0, thresh, 5);
// dilate canny output to remove potential // dilate canny output to remove potential
// holes between edge segments // holes between edge segments
ocl::dilate(gray0_ocl, gray_ocl, Mat(), Point(-1,-1)); ocl::dilate(gray_ocl, gray_ocl, Mat(), Point(-1,-1));
gray = Mat(gray_ocl); gray = Mat(gray_ocl);
} }
else else
{ {
// apply threshold if l!=0: // apply threshold if l!=0:
// tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0 // tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0
gray = gray0 >= (l+1)*255/N; cv::ocl::threshold(gray0_ocl, gray_ocl, (l+1)*255/N, 255, THRESH_BINARY);
gray = gray_ocl;
} }
// find contours and store them all as a list // find contours and store them all as a list

Loading…
Cancel
Save