Table of Contents
常见错误1: Sizes of input arguments do not match
常见错误2:Assertion failed (size.width>0 && size.height>0) in cv::imshow
常见错误3:error C3872: '0xa0': this character is not allowed in an identifier
常见错误4:Assertion failed (data.channels() == 1)
常见错误5:[Python]new style getargs format but argument is not a tuple
常见错误1: Sizes of input arguments do not match
OpenCV(3.4.2) Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and the same type), nor 'array op scalar', nor 'scalar op array') in cv::compare, file D:\software\OpenCV\SourceCode\opencv-3.4.2\modules\core\src\arithm.cpp, line 1262
出错代码:
cv::add(src, whitestar, temp);
解决办法:
add函数要求参数一与参数二的尺寸、channel数量一致,
我检查src与whitestar的尺寸、channel是否一致,
whitestar的尺寸为宽346*高350,而src的尺寸为宽512*高512,所以会出错。
更换whitestar图片(使其尺寸与src的一致)。
常见错误2:Assertion failed (size.width>0 && size.height>0) in cv::imshow
OpenCV(3.4.2) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file D:\software\OpenCV\SourceCode\opencv-3.4.2\modules\highgui\src\window.cpp, line 356
OpenCV: terminate handler is called!
出错代码:
Mat srcImg = imread("lena.jpg"); //载入Lena的图片载入
imshow("Lena", srcImg); //显示图片
分析:
这段代码是打开"lena.jpg"这张图片,实际上这张图片并不在此段代码所在的文件下,
所以imshow会报错,因为读取到的图片width和height都是零, 如下图
解决办法:
方法1. 将lena.jpg图片copy至源文件所在文件夹下
方法2. 图片路径填写绝对路径
Mat srcImg = imread("F:/images/lena.jpg"); //载入Lena的图片载入
还有,重要的一点是要检查imread的返回值,因为它不会报错,而是返回一个空指针。
检查方法1:
if (srcImg.empty())
{
printf("Image read fail!");
return -1;
}
检查方法2:
if (!srcImg.data)
{
printf("Image read fail!");
return -1;
}
常见错误3:error C3872: '0xa0': this character is not allowed in an identifier
出错代码:
Mat writeInImg = imread("lena.jpg"); //载入Lena的图片载入
imshow("Lena", writeInImg); //显示图片 【这一行代码是我直接从博客上复制过来的,结果Build报错,如下图红色波浪线】
分析:这是因为从网络上直接复制代码的问题。0xa0是十六进制数,换成十进制就是160,表示汉字的开始。
解决办法:在报错的代码行检查两边的空格,用英文输入法下的空格替换掉。
常见错误4:Assertion failed (data.channels() == 1)
OpenCV(3.4.2) Error: Assertion failed (data.channels() == 1) in cv::PCA::operator (), file D:\software\OpenCV\SourceCode\opencv-3.4.2\modules\core\src\pca.cpp, line 72
OpenCV: terminate handler is called!
出错代码:
Mat tmpMat = imread("F:/images/cat.jpg"); //在程序中打开一张图片
tmpMat.convertTo(tmpMat, CV_32F, 1.0 / 255); //注意:PCA数据要求为单通道的32位浮点数
int number_principal_compent = 12;//保留最大的主成分数
//构造pca数据结构
PCA pca2(tmpMat, Mat(), CV_PCA_DATA_AS_COL, number_principal_compent);
//将原始数据通过PCA方向投影,即通过特征向量的前面几个作用后的数据,因此这里的dst的尺寸变小了
Mat dst = pca2.project(tmpMat);
imshow("dst", dst);
解决办法:
data.channels() == 1说明输入图片的channel应该为1,而PCA实例化时输入的是三通道图片tmpMat,
所以将其转换为单通道的gray图片即可(也可以用split来拆分通道。)
【注意1】CV_32F对应的上下限为【0.0, 1.0】,其中0对应黑色,1.0对应白色
由CV_8U转为CV_32F时要进行缩小【线性变换的一种】,即乘以1.0/255【注意是1.0,而不是1】
【注意2】OpenCV中PCA数据要求为单通道的32位浮点数
修改后代码:
Mat tmpMat = imread("F:/images/cat.jpg"); //在程序中打开一张图片
Mat gray;
cvtColor(tmpMat, gray, COLOR_BGR2GRAY);
gray.convertTo(gray, CV_32F, 1.0 / 255); //注意:PCA数据要求为单通道的32位浮点数
int number_principal_compent = 12;//保留最大的主成分数
//构造pca数据结构
PCA pca2(gray, Mat(), CV_PCA_DATA_AS_COL, number_principal_compent);
//将原始数据通过PCA方向投影,即通过特征向量的前面几个作用后的数据,因此这里的dst的尺寸变小了
Mat dst = pca2.project(gray);
imshow("dst", dst);
常见错误5:[Python]new style getargs format but argument is not a tuple
cv2.rectangle(drawMat, best[1], (best[1][0] + w_templ, best[1][1] + h_templ), (0, 0, 255), 2)
SystemError: new style getargs format but argument is not a tuple
出错代码:
cv2.rectangle(drawMat, best[1], (best[1][0] + w_templ, best[1][1] + h_templ), (0, 0, 255), 2)
解决办法:
best[1]是一个list,函数要求的是tuple类型,将list转为tuple即可
cv2.rectangle(drawMat, tuple(best[1]), (best[1][0] + w_templ, best[1][1] + h_templ), (0, 0, 255), 2)