Python에서 C++에 대한 답변 중 하나에서 코드를 이식하는 중입니다. 누군가가이를 수행하고 프로세스의 일부를 명확히하기를 바랍니다.OpenCV - convexity 결함 제거 (Python에서 C++로)
제가 이야기에 대한 답변 - https://stackoverflow.com/a/11366549
나는 무게 중심이 정렬되고있는 단계 (마지막 전의 일)에 있어요. 문제의 코드는 그 일을하지만, 코드를 더 이상 만들지 않으면 C++을 사용하여 동일한 결과를 얻는 방법을 확신 할 수 없습니다.
초기 무게 중심 어레이는 이미 (최대 y 값 포인트가 인덱스 0, 최저 99를 갖고 있음) 방식으로 분류된다
centroids = np.array(centroids,dtype = np.float32) c = centroids.reshape((100,2)) c2 = c[np.argsort(c[:,1])] b = np.vstack([c2[i*10:(i+1)*10][np.argsort(c2[i*10:(i+1)*10,0])] for i in xrange(10)]) bm = b.reshape((10,10,2))
I이 달성하고자하는 방법은 다음을 수행한다 , 그래서 그것을 뒤집어서 배열을 위에서 아래로 정렬하고 싶습니다.
- 그것이 내가 그 수행하는 모든 믿을
(x 축 10 열 10 개 행을 정렬) 행을 정렬 단지 문제 그 후
,하지만 난 우아한 방법을 찾을 수 없습니다 코드를 사용하고 (벡터를 사용하지 않고 수동으로 정렬).
또한 이미지가 뒤틀리는 (포트를 만들기가 힘들다) 마지막 단계를 이해하지 못하기 때문에이 부분에서 수행중인 작업에 대한 통찰력을 제공 할 수 있다면 가능합니다. , 나는 그것을 바르게 평가할 것이다.
output = np.zeros((450,450,3),np.uint8)
for i,j in enumerate(b):
ri = i/10
ci = i%10
if ci != 9 and ri!=9:
src = bm[ri:ri+2, ci:ci+2 , :].reshape((4,2))
dst = np.array([ [ci*50,ri*50],[(ci+1)*50-1,ri*50],[ci*50,(ri+1)*50-1],[(ci+1)*50-1,(ri+1)*50-1] ], np.float32)
retval = cv2.getPerspectiveTransform(src,dst)
warp = cv2.warpPerspective(res2,retval,(450,450))
output[ri*50:(ri+1)*50-1 , ci*50:(ci+1)*50-1] = warp[ri*50:(ri+1)*50-1 , ci*50:(ci+1)*50-1].copy()
난 그냥 OpenCV의와 C++ 모두를 배우고, 나는 그래서 나는 누군가가 시간을 절약 다소 기본적인 해답을 제공 할 수있는 희망이 아마 사소한 알고있다.
요청에 따라
편집, 여기에 코드입니다. 나는 첫 부분을 다뤘다. 이것이 올바른 방향인지 확실하지 않다.
#pragma mark Correcting the defects
findContours(res, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
vector<cv::Point> centroids;
centroids.reserve(100);
for (int i = 0; i < contours.size(); i++) {
vector<cv::Point> contour = contours.at(i);
Moments mom = moments(contour);
cv::Point center = cv::Point(int(mom.m10/mom.m00), int(mom.m01/mom.m00));
centroids.push_back(center);
}
std::reverse(centroids.begin(), centroids.end());
struct {
bool operator()(const cv::Point p1, const cv::Point p2) {
return p1.x < p2.x;
}
} pointXGreater;
for (int i = 0; i < 10; i++) {
std::sort(centroids.begin() + i * 10, centroids.begin() + (i + 1) * 10, pointXGreater);
}
Mat b(centroids);
Mat bm = b.reshape(10, 10);
이미지의 중심선을 색인으로 그리면 올바른 것으로 보입니다.
이제 파이썬 코드를 해독하려고하는 마지막 부분에 무엇이 있는지를 모르는 채 붙어 있습니다. 지금까지이있어 :
Mat output = Mat::zeros(450, 450, CV_8U);
for (int i = 0; i < centroids.size(); i++) {
cv::Point j = centroids.at(i);
int ri = i/10;
int ci = i % 10;
if (ci != 9 && ri != 9) {
Mat src = ??
Mat dst = ??
Mat retval = getPerspectiveTransform(src, dst);
Mat warp;
warpPerspective(res2, warp, retval, (450, 450));
Mat output = ??
}
}
파이썬 구문 이런 종류의 당신이 정말로하지 특히 매우 친절하지 않기 때문에 나는 그것을 이해하려고 노력 계속 하겠지만, 도움 정말 감사하겠습니다
무슨 짓을했는지 알아. 머리를 두드리는의 잠시 후
왜 당신은 C++이 특정 섹션에 대한 시도 한을 게시하지 않습니다 (작동하는 것 같다)를 내놓았다 무엇인가? 스택 오버플로는 코드 변환 서비스는 아니지만 특정 문제가 있으면 기꺼이 도와 드리겠습니다. 또한 아직 작성하지 않았다면 ['std :: sort()'] (http://en.cppreference.com/w/cpp/algorithm/sort)를 읽어 볼 수도 있습니다. – Aurelius
게시물을 더 이상 만들고 싶지 않았기 때문에 게시하지 않았습니다. (이미 길기 때문에 생각했습니다.)SO가 코드 변환 서비스가 아니라는 것을 잘 알고 있습니다. 방금 전 꽤 구체적인 주제라고 생각했고 충분한 경험을 가진 사람이 올바른 방향으로 나를 가리킬 수있었습니다. 아직 관련성이있는 내일이면 내가 시도한 코드로 내 게시물을 확장 할 것입니다. 또한 std :: sort out을 확인한 후 시도해 보았지만 C++을 처음 접했을 때 실수를 저질렀을 가능성이 큽니다. – Ilija