Ask Your Question

nurettin's profile - activity

2019-09-26 14:13:26 -0600 received badge  Popular Question (source)
2016-01-14 12:35:00 -0600 received badge  Good Question (source)
2014-07-19 01:51:51 -0600 received badge  Nice Question (source)
2014-07-18 06:20:31 -0600 received badge  Student (source)
2014-07-18 06:18:02 -0600 received badge  Editor (source)
2014-07-18 06:12:13 -0600 asked a question Detecting palm lines

Hi, first time opencv user here trying to retrieve palm lines from images like this:

image description

So far I got rid of the background and concentrated on the palm like this:

// 1. Load img
Mat img = imread(argv[1], CV_LOAD_IMAGE_UNCHANGED);
Size new_size = img.size();
resize(img, img, new_size);
namedWindow("Step 1", CV_WINDOW_AUTOSIZE);
imshow("Step 1", img);

// 2. Grayscale img2
Mat img2;
cvtColor(img, img2, CV_BGR2GRAY);

// 3. Blur 3x3 img2
blur(img2, img2, Size(3, 3));

// 4. Threshold img2
threshold(img2, img2, 125, 255, THRESH_BINARY);

// 5. Find Contours img2
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(img2, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

// 6. Get Longest (hand) Contour
auto max_contour = std::max_element(contours.begin(), contours.end(), [](std::vector<Point> const &v1, std::vector<Point> const &v2){
    return v1.size()< v2.size();
});
if (max_contour == contours.end())
    throw std::runtime_error("No contours found!");
auto max_contour_index = std::distance(contours.begin(), max_contour);

// 7. Draw Contour filled img3
Mat img3(img2.size(), CV_8UC1, Scalar(0));
drawContours(img3, contours, max_contour_index, Scalar(255), CV_FILLED);

// 8. Use img3 as mask to copy img to img3
img.copyTo(img3, img3);

Which gives me this result:

image description

Now I need to extract these palmlines as polygons. However, I'm having trouble coming up with the correct preprocessing and detection algorithms.

I tried to preprocess with:

cvtColor(img3, img3, CV_BGR2GRAY);
Mat temp_img;
blur(img3, temp_img, Size(3, 3));
threshold(img3, temp_img, 138, 255, THRESH_BINARY);
Canny(temp_img, temp_img, 150, 150 * 3, 3);

With various parameters using sliders, but it's not giving any results that I can use in edge detection.

What algorithm can I use to extract these palm lines?

Ideally I'd like to extract something like this:

image description