def deskew(img): m = cv2.moments(img) if abs(m['mu02']) < 1e-2: return img.copy() skew = m['mu11'] / m['mu02'] M = np.float32([[1, skew, -0.5 * SZ * skew], [0, 1, 0]]) img = cv2.warpAffine(img, M, (SZ, SZ), flags=cv2.WARP_INVERSE_MAP | cv2.INTER_LINEAR) return img
时间: 2023-06-18 07:06:28 浏览: 203
这是一个用于图像去斜的函数,主要使用了图像的矩来计算倾斜角度,然后使用仿射变换将图像进行矫正。具体来说,该函数的输入参数为一个图像对象img,输出为一个去斜后的图像对象。其中,SZ代表图像的大小,mu02和mu11是图像的二阶和一阶矩。函数的主要流程如下:
1. 计算图像的二阶和一阶矩m;
2. 计算图像的倾斜角度skew;
3. 构造仿射变换矩阵M;
4. 对图像进行仿射变换,得到去斜后的图像。
需要注意的是,函数中的WARP_INVERSE_MAP和INTER_LINEAR参数分别表示反向映射和双线性插值,在进行仿射变换时非常重要。
相关问题
def deskew(img): m = cv2.moments(img) if abs(m['mu02']) < 1e-2: return img.copy() skew = m['mu11']/m['mu02'] s=img.shape[0] M = np.float32([[1, skew, -0.5*s*skew], [0, 1, 0]]) affine_flags = cv2.WARP_INVERSE_MAP|cv2.INTER_LINEAR size=img.shape[::-1] img = cv2.warpAffine(img,M,size,flags=affine_flags) return img代码含义
这段代码实现了一个函数 deskew(img),它可以将输入的图像进行纠倾处理。首先,通过计算图像的矩阵来计算图像的倾斜程度,如果程度很小,则直接返回原图像副本。否则,通过计算仿射矩阵来对图像进行纠倾处理。最后,使用 cv2.warpAffine() 函数对图像进行仿射变换,并返回处理后的图像。
class CardPredictor: def __del__(self): self.save_traindata() def train_svm(self): # 识别英文字母和数字 self.model = SVM(C=1, gamma=0.5) # 识别中文 self.modelchinese = SVM(C=1, gamma=0.5) if os.path.exists("svm.dat"): self.model.load("svm.dat") else: chars_train = [] chars_label = [] for root, dirs, files in os.walk("train\\chars2"): if len(os.path.basename(root)) > 1: continue root_int = ord(os.path.basename(root)) for filename in files: filepath = os.path.join(root, filename) digit_img = cv2.imread(filepath) digit_img = cv2.cvtColor(digit_img, cv2.COLOR_BGR2GRAY) chars_train.append(digit_img) chars_label.append(root_int) chars_train = list(map(deskew, chars_train)) chars_train = preprocess_hog(chars_train) chars_label = np.array(chars_label) self.model.train(chars_train, chars_label) if os.path.exists("svmchinese.dat"): self.modelchinese.load("svmchinese.dat") else: chars_train = [] chars_label = [] for root, dirs, files in os.walk("train\\charsChinese"): if not os.path.basename(root).startswith("zh_"): continue pinyin = os.path.basename(root) index = provinces.index(pinyin) + PROVINCE_START + 1 # 1是拼音对应的汉字 for filename in files: filepath = os.path.join(root, filename) digit_img = cv2.imread(filepath) digit_img = cv2.cvtColor(digit_img, cv2.COLOR_BGR2GRAY) chars_train.append(digit_img) chars_label.append(index) chars_train = list(map(deskew, chars_train)) chars_train = preprocess_hog(chars_train) chars_label = np.array(chars_label) self.modelchinese.train(chars_train, chars_label)
这段代码实现了一个卡牌识别器,使用 SVM 算法来识别卡牌上的数字、英文字母和汉字。它将训练数据从文件中读取,对于数字和英文字母,训练数据位于 "train\\chars2" 文件夹中;对于汉字,训练数据位于 "train\\charsChinese" 文件夹中。训练数据中的每张图片都经过了去倾斜、HOG 特征提取等预处理操作,最后使用 SVM 算法进行训练。训练好的模型可以保存到文件中以便于之后的使用。当程序结束时,会自动保存训练数据。
阅读全文