私は同様の質問をしましたが、numpyの配列Opencv Python Crop Image Using Numpy Arrayを使用しています。私はコーナーに基づいて画像を切り抜くことを目指しています。ここに目標を示すための写真があります。 Opencv 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;
}
を試してみて、 'X'と 'y'は、単に整数のリストです。それで、なぜC++でPointsのベクトルのベクトルのベクトルにするのですか? –
ほとんどの場合、整数のベクトルを使用します。ループの内側には、各輪郭の各点のすべてのx座標とy座標が挿入されます。次に、入力画像に 'std :: minmax_element'、最後に' operator() 'のようなものを入れて、部分領域を抽出します。試してみます。 –
@DanMašekポイントのベクトルのベクトルのベクトルは、私がずっと働いていて、脳が揚げられていました。私の考えはxで、yはリストなので、ベクトルにしました。輪郭を追加してから、そのタイプを追加して混乱を招いてしまいました。可能であれば、各カウンタの各点のx座標とy座標を挿入する方法について詳しく説明してください。他の部分は完全に意味をなさない。ご協力ありがとうございます! –