Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct custom_point {
- int y;
- int x;
- byte dir;
- };
- void findContour() {
- char fname[MAX_PATH];
- while (openFileDlg(fname)) {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat dst = Mat(src.size(), CV_LOAD_IMAGE_GRAYSCALE);
- std::vector<custom_point> contur;
- int n = 0;
- byte dir = 7;
- int x, y;
- int dj[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int di[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- int I = 0, J = 0;
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- dst.at<uchar>(i, j) = 255;
- }
- }
- bool ok = true;
- for (int i = 0; i < src.rows && ok; i++) {
- for (int j = 0; j < src.cols && ok; j++) {
- if (src.at<uchar>(i, j) == 0) {
- dst.at<uchar>(i, j) = 0;
- contur.push_back(custom_point{ i, j, dir });
- I = i;
- J = j;
- ok = false;
- }
- }
- }
- bool finished = false;
- byte d = 0;
- while (!finished) {
- if (dir % 2 == 0) {
- dir = (dir + 7) % 8;
- } else {
- dir = (dir + 6) % 8;
- }
- for (int k = 0; k < 8; k++) {
- d = (dir + k) % 8;
- y = J + dj[d];
- x = I + di[d];
- if (src.at<uchar>(x, y) == 0) {
- dir = d;
- dst.at<uchar>(x, y) = 0;
- contur.push_back(custom_point{ x, y, dir });
- I = x;
- J = y;
- n++;
- break;
- }
- }
- if (n > 1) {
- if ((contur[0].x == contur[n - 1].x) && (contur[1].x == contur[n].x) &&
- (contur[0].y == contur[n - 1].y) && (contur[1].y == contur[n].y)) {
- finished = true;
- }
- }
- }
- imshow("Img", src);
- imshow("New Img", dst);
- waitKey();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement