Line detection method
Hi Guys, I'm trying to do some project to detect um object in microscope. I'm using OpenCV for some time, but I dont underestand everything...
Goal is:
- with movable cursor find centre line of two rectangular object
- find contour line in each quadrant
- via start and end point find if rectangles are parallel
- print out diff angle, draw contour lines
- calculate rectangles middle line and print distance of lines in center
- ALL OF IT DO FAST (2-10 FPS)
I'm using Qt with c\c++ and openCV
This is my image after BW threshold
And this is my image after Canny
I'm not able to find lines after Canny via HoughLineP, and I don't know why
Can you suggest my why ? Here is my source code
if(mat_orig.empty() == false) { cvtColor(mat_orig,mat_orig,CV_RGB2GRAY); int cursor_x, top_limit, bot_limit; int w_second; int h_mid; int o_x, o_y;o_x = mat_orig.cols; o_y = mat_orig.rows; cursor_x = mat_orig.cols/2; //Here should be number from mouse x coord top_limit = o_y/2 - o_y*0.05; bot_limit = o_y/2 + o_y*0.05; w_second = o_x - cursor_x; h_mid = o_y - (2 * top_limit); //Make Partition mat_part[0] = mat_orig(Rect(0, 0, cursor_x, top_limit)); mat_part[1] = mat_orig(Rect(cursor_x, 0, w_second, top_limit)); mat_part[2] = mat_orig(Rect(0, bot_limit, cursor_x, top_limit)); mat_part[3] = mat_orig(Rect(cursor_x, bot_limit, w_second, top_limit)); mat_part_mid = mat_orig(Rect(0, top_limit, o_x, h_mid)); // some vars for process int i=0; vector<Vec4i> lines; Vec4i l; int dy_max = 1; char points[50]; //loop calculate thresh, canny and hough for all 4 quads for (i=0; i<4; i++) { threshold(mat_part[i], mat_part[i], 0, 255, CV_THRESH_BINARY + CV_THRESH_OTSU); Canny(mat_part[i], mat_part[i], 200, 600, 3,true); HoughLinesP(mat_part[i], lines, 1, CV_PI/(180), 300, 200, 0); cvtColor(mat_part[i], mat_part[i],CV_GRAY2RGB); //I need draw only longest line, not borders! for( size_t j = 0; j < lines.size(); j++ ) { if((lines[j][0] > 10) || (lines[j][0] < (mat_part[j].cols - 10)) || (lines[j][2] > 10) || (lines[j][2] < (mat_part[j].cols - 10))) { continue; } int dy = abs(lines[j][1] - lines[j][3]); if (dy > dy_max) { dy_max = dy; l = lines[j]; } } //draw longest line(mat_part[i],Point(l[0],l[1]),Point(l[2],l[3]),Scalar(255,0,0),1); } cvtColor(mat_part_mid, mat_part_mid,CV_GRAY2RGB); //middle horizontal line (need visible horizontal center of image) line(mat_part_mid,Point(0,mat_part_mid.rows/2),Point(mat_part_mid.cols,mat_part_mid.rows/2), Scalar(255,0,255),1); //pic reconstruction hconcat(mat_part[0],mat_part[1],mat_part_top); hconcat(mat_part[2],mat_part[3],mat_part_bot); vconcat(mat_part_top, mat_part_mid, mat_part_tm); vconcat(mat_part_tm, mat_part_bot, mat_part_whole); cvtColor(mat_part_whole,mat_canny_view,CV_GRAY2RGB); cv::resize(mat_canny_view,mat_canny_view_s,sizeMat); QImage qimgProcCanny((uchar*)mat_canny_view_s.data, mat_canny_view_s.cols, mat_canny_view_s.rows, mat_canny_view_s.step, QImage::Format_RGB888); ui->label_result->setPixmap(QPixmap::fromImage(qimgProcCanny));
i wonder why "with movable cursor find centre line of two rectangular object" ? IMHO you can find it easily
I have to set division point for quadrant partition, its quite hard to set threshold in whole frame, so I divided it into 4 parts and calculate it four times
i tried to test and understand your code. IMHO you can do what you want by better way using cv::findContours, approxPolyDP,RotatedRect etc.
http://docs.opencv.org/master/d1/dee/...
I Thank you for your ideas! I tried findContours and I find that usefull, but I need to split curves and aproximate just line from len/fiber siluete. thats where I'll try use PCA as you suggest! you really helped me! Thanks!