我试图让OpenCV 2.4.5从我的网络摄像头识别棋盘图案.我无法做到这一点,所以我决定尝试使用"完美"的图像让它工作:

但它仍然不起作用 - patternFound每次都返回false.有谁知道我做错了什么?
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(){
Size patternsize(8,8); //number of centers
Mat frame = imread("perfect.png"); //source image
vector<Point2f> centers; //this will be filled by the detected centers
bool patternfound = findChessboardCorners(frame,patternsize,centers);
cout<<patternfound<<endl;
drawChessboardCorners(frame, patternsize, Mat(centers), patternfound);
cvNamedWindow("window");
while(1){
imshow("window",frame);
cvWaitKey(33);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenCV找到棋盘的角落.
我正在使用的图像包含两个棋盘,但我只对其中一个的子区域感兴趣.下图显示了原始图像.

然后使用GIMP,我选择了感兴趣的区域,并将所有其他像素设置为默认值.

我实际上没有裁剪图像,因为我已经使用这个图像尺寸校准了相机,我不想改变它.该操作应该相当于更改图像矩阵中的值,但我更喜欢使用GIMP.这是一次性实验,使用图形工具而不是使用代码执行该操作更快.
生成的图像包含一个24x5角的棋盘,但函数findChessboardCorners无法找到任何内容.
这是我正在使用的Python代码:
>>> img = cv2.imread('C:\\Path\\To\\C4-Cropped.png', 0)
>>> cv2.findChessboardCorners(img, (24, 5))
(False, None)
>>> cv2.findChessboardCorners(img, (5, 24))
(False, None)
Run Code Online (Sandbox Code Playgroud)
我也尝试设置自适应阈值,但它仍然无效
>>> cv2.findChessboardCorners(img, (24, 5), flags=cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH)
(False, None)
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪.我过去多次使用OpenCV的这个功能,它总是有效,即使图像看起来比这个复杂得多.该区域的照明不均匀,但功能应足够强大以处理.
使用GIMP临时创建的人工图像有什么问题吗?我怎样才能找到角落?
任何建议将不胜感激.