2014-02-21 96 views
0

我使用下面的代碼來找到國際象棋棋盤上的角落 ,但是當我運行它時,我什麼都沒有顯示圖像 並沒有顯示角落已被發現,儘管在頁面opencv他們說應該出現一個圖像。python和opencv的校準

import numpy as np 
import cv2 
import glob 

# termination criteria 
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) 

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 
objp = np.zeros((6*7,3), np.float32) 
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) 

# Arrays to store object points and image points from all the images. 
objpoints = [] # 3d point in real world space 
imgpoints = [] # 2d points in image plane. 

images = glob.glob('*.jpg') 

for fname in images: 
img = cv2.imread(fname) 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

# Find the chess board corners 
ret, corners = cv2.findChessboardCorners(gray, (7,6),None) 

# If found, add object points, image points (after refining them) 
if ret == True: 
    objpoints.append(objp) 

    corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) 
    imgpoints.append(corners2) 

    # Draw and display the corners 
    img = cv2.drawChessboardCorners(img, (7,6), corners2,ret) 
    cv2.imshow('img',img) 
    cv2.waitKey(500) 

cv2.destroyAllWindows() 

下面是我使用的電路板圖像:

Board image

回答

0

如果角落被發現,你只給了顯示一些程序。

首先,檢查圖像是否已成功加載,在img = cv2.imread(fname)之後加上cv2.imshow('img',img)

其次,它可能是角落沒有在您使用的圖像(有時會發生)中檢測到。用簡單的圖像嘗試相同的程序,其中棋盤在圖像的中心清晰可見。

+0

我檢查了圖像已經加載,我嘗試了其他圖像,但仍然有相同的結果! – Sabrine

+0

您可以添加您在問題中使用的圖像嗎? – AldurDisciple

+0

好的,你應該看看OpenCV校準教程(http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html#cameracalibrationopencv)。嘗試使用原始棋盤圖像進行校準是沒有意義的。基本上,您需要打印棋盤圖像,將其粘貼在一塊木頭上,然後使用相機觀察它以校準相機。 – AldurDisciple

1
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/core/core.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include "opencv2/contrib/contrib.hpp" 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    //int numBoards = atoi(argv[1]); 
    //int board_w = atoi(argv[2]); 
    //int board_h = atoi(argv[3]); 

    int numBoards =50; // number of different poses 
    int board_w =122; // number of horizontal corners 
    int board_h =154; // number of vertical corners 


    Size board_sz = Size(board_w, board_h); 
    int board_n = board_w*board_h; 

    vector<vector<Point3f> > object_points; 
    vector<vector<Point2f> > image_points; 
    vector<Point2f> corners; 

    vector<Point3f> obj; 
    for (int j=0; j<board_n; j++) 
    { 
     obj.push_back(Point3f(j/board_w, j%board_w, 0.0f)); 
    } 

    Mat img, gray; 
    VideoCapture cap = VideoCapture(0); //change to laptop on built web cam 

    int success = 0; 
    int k = 0; 
    bool found = false; 
    while (success < numBoards) 
    { 
     cap >> img; 
     cvtColor(img, gray, CV_BGR2GRAY); 
     found = findChessboardCorners(gray, board_sz, corners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS); 

     if (found) 
     { 
      cornerSubPix(gray, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1)); 
      drawChessboardCorners(gray, board_sz, corners, found); 
     } 

     imshow("image", img); 
     imshow("corners", gray); 

     k = waitKey(1); 
     if (found) 
     { 
      k = waitKey(0); 
     } 
     if (k == 27) 
     { 
      break; 
     } 
     if (k == ' ' && found !=0) 
     { 
      image_points.push_back(corners); 
      object_points.push_back(obj); 
      printf ("Corners stored\n"); 
      success++; 

      if (success >= numBoards) 
      { 
       break; 
      } 
     } 

    } 
    destroyAllWindows(); 
    printf("Starting calibration\n"); 
    Mat intrinsic = Mat(3, 3, CV_32FC1); 
    Mat distcoeffs; 
    vector<Mat> rvecs, tvecs; 

    intrinsic.at<float>(0, 0) = 1; 
    intrinsic.at<float>(1, 1) = 1; 

    calibrateCamera(object_points, image_points, img.size(), intrinsic, distcoeffs, rvecs, tvecs); 

    FileStorage fs1("/Users/venushka/Desktop/2015/mycalib.yml", FileStorage::WRITE); 
    fs1 << "CM1" << intrinsic; 
    fs1 << "D1" << distcoeffs; 

    printf("calibration done\n"); 

    Mat imgU; 
    while(1) 
    { 
     cap >> img; 
     undistort(img, imgU, intrinsic, distcoeffs); 

     imshow("image", img); 
     imshow("undistort", imgU); 

     k = waitKey(5); 
     if (k == 27) 
     { 
      break; 
     } 
    } 
    cap.release(); 
    return(0); 
} 

試試這個代碼

0

也許問題是因爲該行圖像= glob.glob( '*。JPG')無法找到圖像。把它手動並檢查。例如: IMG = cv2.imread(「left12.jpg」)

0

也許問題是代碼行

cv2.waitKey(500) 

所以,即使你發現你不會真的看到的東西角落,因爲直到窗口得到由

cv2.destroyAllWindows() 

關閉,以便更換500爲零,直至你專注於它的克利克在鍵盤按鍵上的窗口將保持打開這條線只等待500毫秒。