2013-08-30 4 views
1

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 = ?? 
    } 
} 
파이썬 구문 이런 종류의 당신이 정말로하지 특히 ​​매우 친절하지 않기 때문에 나는 그것을 이해하려고 노력 계속 하겠지만, 도움 정말 감사하겠습니다

무슨 짓을했는지 알아. 머리를 두드리는의 잠시 후

+0

왜 당신은 C++이 특정 섹션에 대한 시도 한을 게시하지 않습니다 (작동하는 것 같다)를 내놓았다 무엇인가? 스택 오버플로는 코드 변환 서비스는 아니지만 특정 문제가 있으면 기꺼이 도와 드리겠습니다. 또한 아직 작성하지 않았다면 ['std :: sort()'] (http://en.cppreference.com/w/cpp/algorithm/sort)를 읽어 볼 수도 있습니다. – Aurelius

+0

게시물을 더 이상 만들고 싶지 않았기 때문에 게시하지 않았습니다. (이미 길기 때문에 생각했습니다.)SO가 코드 변환 서비스가 아니라는 것을 잘 알고 있습니다. 방금 전 꽤 구체적인 주제라고 생각했고 충분한 경험을 가진 사람이 올바른 방향으로 나를 가리킬 수있었습니다. 아직 관련성이있는 내일이면 내가 시도한 코드로 내 게시물을 확장 할 것입니다. 또한 std :: sort out을 확인한 후 시도해 보았지만 C++을 처음 접했을 때 실수를 저질렀을 가능성이 큽니다. – Ilija

답변

1

이 내가

#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 bm = Mat(centroids); 
bm = bm.reshape(2, 10); 

Mat output(450, 450, CV_8UC3, CV_RGB(1, 1, 1)); 

for (int i = 0; i < centroids.size(); i++) { 
    int ri = i/10; 
    int ci = i % 10; 

    if (ci != 9 && ri != 9) { 
     cv::Point2f src[4]; 
     src[0] = cv::Point2f(bm.at<cv::Point>(ri, ci).x, bm.at<cv::Point>(ri, ci).y); 
     src[1] = cv::Point2f(bm.at<cv::Point>(ri, ci + 1).x, bm.at<cv::Point>(ri, ci + 1).y); 
     src[2] = cv::Point2f(bm.at<cv::Point>(ri + 1, ci).x, bm.at<cv::Point>(ri + 1, ci).y); 
     src[3] = cv::Point2f(bm.at<cv::Point>(ri + 1, ci + 1).x, bm.at<cv::Point>(ri + 1, ci + 1).y); 

     cv::Point2f dst[4]; 
     dst[0] = cv::Point2f(ci * 50, ri * 50); 
     dst[1] = cv::Point2f((ci + 1) * 50 - 1, ri * 50); 
     dst[2] = cv::Point2f(ci * 50, (ri + 1) * 50 - 1); 
     dst[3] = cv::Point2f((ci + 1) * 50 - 1, (ri + 1) * 50 - 1); 

     Mat retval = getPerspectiveTransform(src, dst); 
     Mat warp; 
     warpPerspective(res2, warp, retval, cv::Size(450, 450)); 

     for (int j = ri * 50; j < (ri + 1) * 50 - 1; j++) { 
      for (int k = ci * 50; k < (ci + 1) * 50 - 1; k++) { 
       output.at<Vec3b>(j, k) = warp.at<Vec3b>(j, k); 
      } 
     } 
    } 
} 
관련 문제