[英]Opencv C++ Crop Image based on changing corners
I asked a similar question but for python using a numpy array Opencv Python Crop Image Using Numpy Array . 我问了一个类似的问题,但对于使用numpy数组的python,使用Numpy Array的Opencv Python作物图像 。 I am looking to crop an image based on its corners.
我正在寻找基于其角落的图像。 Here is a photo to demonstrate the goal.
这是一张展示目标的照片。
I have python code that does the trick but need to convert it to C++. 我有可以解决问题的python代码,但需要将其转换为C ++。 The following is my working python code and partial C++ code respectively.
以下是我的工作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++ Code: 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;
}
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;
}
Try this 尝试这个
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;
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.