从一个倾斜的蒙版上沿着几条线获取像素值



目前我已经分割了对象(矩形),现在我想创建一个直线轮廓。我不知道该如何处理这件事。

检测对象

目的是得到这个:

对象与行

14章25条的更新:

我已经知道了边界矩形的角度,并使用它来计算y方向的位移,以便将值重新排列到一个新的垫子上,这样我只需要通过矩阵来获得线条轮廓。

这是我的代码,但是重新排列不起作用。

Mat imgIn(SizeY, SizeX, CV_16U, &Wire[0]), 
imgOut(SizeY, SizeX, CV_16U, Scalar(0)), 
temp, drawing, mask, lineProfile(SizeY, SizeX, CV_16U, Scalar(0));
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
Point center;
char buffer[100];
bool found = false;
int rect_no (0);
double angle(0.0);
// Detecting outer contours
    temp = ::adaptiveThreshold(imgIn, SizeY, SizeX, kernelSize, thresh, 0);
     // Find contours
    findContours(temp, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_TC89_KCOS, Point(0, 0) );
    /// Find the rotated rectangles and ellipses for each contour
    vector<RotatedRect> minRect( contours.size() );
    for( int i = 0; i < contours.size(); i++ ) minRect[i] = minAreaRect( Mat(contours[i]) );
    // Draw contours + rotated rects
    drawing = Mat::zeros(temp.size(), CV_8U );
    Point2f rect_points[4];
    for( int i = 0; i< minRect.size(); i++ ){
        if((float)minRect[i].boundingRect().height/(float)minRect[i].boundingRect().width > 3.0 && (float)minRect[i].boundingRect().height/(float)minRect[i].boundingRect().width < 4.9){      
            // rotated rectangle
             minRect[i].points(rect_points);
            for(int j = 0; j < 4; j++) line(drawing, rect_points[j], rect_points[(j+1)%4], Scalar(255), 1, 8);
            //found = minRect[i].boundingRect().contains(Point(459, 512));
            if(minRect[i].boundingRect().area() > 1000)
            rect_no = i;
        }
    }
 center = computeCentroid(drawing);
 cv::floodFill(drawing, center, cv::Scalar(255));
 drawing.convertTo(imgOut, CV_16U, 257.0);
 imgIn.copyTo(imgOut, drawing);
 // Calculate Wire SR_min
 // Get angle of Wire
 angle = (90 - (-1 * minRect[rect_no].angle))*(CV_PI/180);
 for(int i = 0;i < SizeY;i++){
    for(int j = 0;j < SizeX;j++){
        if(imgOut.at<ushort>(i, j) != 0)
        lineProfile.at<ushort>(i, j) = imgOut.at<ushort>((unsigned short)(i/cos(angle)), j);
    }
 }

for(int i = 0;i < SizeY;i++){
    for(int j = 0;j < SizeX;j++){
            *Wire++ = lineProfile.at<ushort>(i, j);//imgOut.at<ushort>(i, j);
    }
}

如果您知道行开始和结束的坐标,那么使用OpenCV的LineIterator获取行上每个点的值应该很容易。输入你的图片和你的两点,让它发挥它的魔力。

如果您能够二值化检测到的对象图像,那么您可能能够应用OpenCv的Houghlines函数。你可以在下面的链接中找到它http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

相关内容

  • 没有找到相关文章

最新更新