我有一个检测帧中一条线的程序,我的问题是:如何访问形成该线的像素的值,我有线的极坐标:角度和到0的距离:这是我获取行位置的代码:
....................
cv::Canny(dilationResult,canny,50,200,3);
cv::HoughLines(canny,lineQ,1,CV_PI/180,200);
for( size_t i = 0; i < lineQ.size(); i++ )
{
float rho = lineQ[i][0], theta = lineQ[i][1];
cv::Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
angle = atan2f((pt2.y-pt1.y),(pt2.x-pt1.x))*180.0/CV_PI; // getting the angle of the lines
std::cout << "angle " << angle<< std::endl;
line( mask, pt1, pt2, cv::Scalar(0,0,255), 3, CV_AA);
}
让我说我得到了这个框架 如何获取线条的值?
提前感谢您的帮助!
答案 0 :(得分:7)
您可以使用LineIterator获取该行的每个点。例如(假设3频道图像):
cv::LineIterator it(dilationResult, pt1, pt2, 8);
std::vector<cv::Vec3b> buf(it.count);
std::vector<cv::Point> points(it.count);
for(int i = 0; i < it.count; i++, ++it)
{
buf[i] = *(const cv::Vec3b)*it;
points[i] = it.pos();
}
另外,因为您正在使用Canny,所以行将检测到两条边。
答案 1 :(得分:2)
迭代在线像素执行B ...显示。
添加:如果您需要亚像素精度的线位置,您可以使用参数alpha [0到1]参数化线:
cv::Point2f subpixel;
subpixel.x = alpha*pt1.x + (1.0f - alpha)*pt2.x
subpixel.y = alpha*pt1.y + (1.0f - alpha)*pt2.y