2017-06-29 17 views
0

私は同様の質問をしましたが、numpyの配列Opencv Python Crop Image Using Numpy Arrayを使用しています。私はコーナーに基づいて画像を切り抜くことを目指しています。ここに目標を示すための写真があります。 Cropping GoalOpencv C++画像の切り抜き角の変更に基づいて

私はトリックを行うが、それをC++に変換する必要のあるPythonコードを持っています。以下は私の働くpythonコードと部分的なC++コードです。

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; 
} 
+0

を試してみて、 'X'と 'y'は、単に整数のリストです。それで、なぜC++でPointsのベクトルのベクトルのベクトルにするのですか? –

+0

ほとんどの場合、整数のベクトルを使用します。ループの内側には、各輪郭の各点のすべてのx座標とy座標が挿入されます。次に、入力画像に 'std :: minmax_element'、最後に' operator() 'のようなものを入れて、部分領域を抽出します。試してみます。 –

+0

@DanMašekポイントのベクトルのベクトルのベクトルは、私がずっと働いていて、脳が揚げられていました。私の考えはxで、yはリストなので、ベクトルにしました。輪郭を追加してから、そのタイプを追加して混乱を招いてしまいました。可能であれば、各カウンタの各点のx座標とy座標を挿入する方法について詳しく説明してください。他の部分は完全に意味をなさない。ご協力ありがとうございます! –

答えて

0
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; 

}

0
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; 
} 

Pythonでこの

+0

提案していただきありがとうございます。残念ながら、私はあなたのコードを試してみました: 'std :: __ 1 :: __ wrap_iter 'から 'int'への実行可能な変換はありませんでしたので、ベクトルにintを変更しました :: iterator x1 ectですが、 ints。 –

関連する問題