代码之家  ›  专栏  ›  技术社区  ›  C.Radford

基于角点变化的Opencv C++裁剪图像

  •  0
  • C.Radford  · 技术社区  · 7 年前

    Opencv Python Crop Image Using Numpy Array Cropping Goal

    def crop(self,image):
        grayed = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        (_,thresh) = cv2.threshold(grayed,1,255,cv2.THRESH_BINARY)
        result, contours, _= cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        x, y = [], []
        for i in range(len(contours)):
            for j in range(len(contours[i])):
                x.append(contours[i][j][0][0])
                y.append(contours[i][j][0][1])
        x1, x2, y1, y2 = min(x), max(x), min(y), max(y)
        cropped = image[y1:y2, x1:x2]
        return cropped
    

    C++代码:

    Mat crop(Mat image){
        Mat cropped, grayed, thresh, result;
        vector<vector<Point>> contours;
        vector<Vec4i> hierarchy;
        cvtColor(image, grayed, CV_BGR2GRAY);
        threshold( grayed, thresh, 1, 255,THRESH_BINARY);
        findContours( thresh, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    
        std::vector<int> x,y;
        cout << contours.size() << endl;
        for(int i=0; i < contours.size();i++){
            for(int j = 0; j < contours.at(i).size();j++){
                x.push_back(contours.at(i).at(j).x);
                y.push_back(contours.at(i).at(j).y);
            }
        }
    
       cout << x.size() << endl;
       cout << y.size() << endl;
    
        vector<int>::iterator it = max(begin(x), end(x));
        int x1 = (*it);
        it = max(begin(x), end(x));
        int x2 = *it;
        it = min(begin(y), end(y));
        int y1 = *it;
        it = max(begin(y), end(y));
        int y2 = *it;
    
        cout << x1 << "   " << x2 << "    " << y1 << "     " << y2 << endl;
    
        Rect rect (x1,y1,x2-x1,y2-y1);
        cropped = image(rect);
        return cropped;
    }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   BatyaGG    7 年前
    cv::Mat crop(cv::Mat image){
      cv::Mat cropped, grayed, thresh, result;
      std::vector < std::vector < cv::Point >> contours;
      std::vector<cv::Vec4i> hierarchy;
      cvtColor(image, grayed, cv::COLOR_BGR2GRAY);
      threshold(grayed, thresh, 1, 255, cv::THRESH_BINARY);
      findContours(result, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
      std::vector<int> x, y;
    
      for (int i = 0; i < contours.size(); i++){
          for (int j = 0; j <= contours.at(i).size(); j++){
              x.push_back(contours.at(i).at(j).x);
              y.push_back(contours.at(i).at(j).y);
          }
      }
      int x1 = std::min_element(x.begin(), x.end());
      int x2 = std::max_element(x.begin(), x.end());
      int y1 = std::min_element(y.begin(), y.end());
      int y2 = std::max_element(y.begin(), y.end())
    
      cv::Rect rect(x1, y1, x2 - x1, y2 - y1);
      cropped = image(rect);
    
      return cropped;
    }
    

    试试这个

        2
  •  0
  •   C.Radford    7 年前
    Mat crop(Mat image){
    Mat cropped, grayed, thresh, result;
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    cvtColor(image, grayed, CV_BGR2GRAY);
    threshold( grayed, thresh, 1, 255,THRESH_BINARY);
    findContours( thresh, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    
    vector<int> x,y;
    for(int i=0; i < contours.size();i++){
        for(int j = 0; j < contours.at(i).size();j++){
            x.push_back(contours[i][j].x);
            y.push_back(contours[i][j].y);
        }
    }
    
    auto xVals = std::minmax_element(x.begin(), x.end());
    auto yVals = std::minmax_element(y.begin(), y.end());
    
    Rect rect (*xVals.first,*yVals.first,(*xVals.second)-(*xVals.first),(*yVals.second)-(*yVals.first));
    cropped = image(rect);
    return cropped;