cv-qualified and cv-unqualified

本文介绍了C++中的cv限定符概念,包括const和volatile两种类型。这些限定符可以用于变量、函数等声明中,以指定其是否可修改或是否可能在外部被更改。没有这些限定符的类型称为cv未限定类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 a cv-qualified type is the “const”, “volatile” or “const volatile” 
version of a type. that is, a variable, function, etc. declared without 
one of those is cv-unqualified, while the addition of one of those 
specifies a cv-qualified type.

c: const

v: volatile

def init_ui(self): central_widget = QWidget() main_layout = QHBoxLayout() # 左侧控制面板 control_panel = QVBoxLayout() control_panel.setContentsMargins(10, 10, 10, 10) control_panel.setSpacing(15) # 系统标定 calibrate_btn = QPushButton('系统标定') calibrate_btn.clicked.connect(self.calibrate_system) control_panel.addWidget(calibrate_btn) # 参考物体选择 self.reference_combo = QComboBox() self.reference_combo.addItems(['选择参考物体'] + list(ObjectMeasurement.STANDARD_SIZES.keys())) self.reference_combo.currentTextChanged.connect(self.select_reference) control_panel.addWidget(QLabel('参考物体类型:')) control_panel.addWidget(self.reference_combo) # 标准尺寸设置 control_panel.addWidget(QLabel('标准尺寸设置')) std_layout = QVBoxLayout() std_layout.setSpacing(5) self.std_width_input = QLineEdit() self.std_width_input.setPlaceholderText('标准宽度(cm)') std_layout.addWidget(QLabel('标准宽度:')) std_layout.addWidget(self.std_width_input) self.std_height_input = QLineEdit() self.std_height_input.setPlaceholderText('标准高度(cm)') std_layout.addWidget(QLabel('标准高度:')) std_layout.addWidget(self.std_height_input) self.tolerance_input = QLineEdit() self.tolerance_input.setPlaceholderText('允许误差(%)') std_layout.addWidget(QLabel('允许误差:')) std_layout.addWidget(self.tolerance_input) set_std_btn = QPushButton('设置标准') set_std_btn.clicked.connect(self.set_standard_size) std_layout.addWidget(set_std_btn) control_panel.addLayout(std_layout) # 功能按钮 image_measure_btn = QPushButton('图像测量') image_measure_btn.clicked.connect(self.measure_image) control_panel.addWidget(image_measure_btn) save_btn = QPushButton('保存结果') save_btn.clicked.connect(self.save_measurements) control_panel.addWidget(save_btn) # 摄像头控制 self.camera_combo = QComboBox() self.camera_combo.addItems(self.camera_manager.get_camera_names()) self.camera_combo.currentIndexChanged.connect(self.switch_camera) control_panel.addWidget(QLabel('选择摄像头:')) control_panel.addWidget(self.camera_combo) camera_measure_btn = QPushButton('实时测量') camera_measure_btn.clicked.connect(self.toggle_camera_measurement) control_panel.addWidget(camera_measure_btn) # 结果显示区 self.result_text = QTextEdit() self.result_text.setReadOnly(True) control_panel.addWidget(self.result_text) # 图像显示区 self.image_label = QLabel('图像显示区') self.image_label.setAlignment(Qt.AlignCenter) self.image_label.setStyleSheet("background-color: #f0f0f0;") main_layout.addLayout(control_panel, 1) main_layout.addWidget(self.image_label, 3) central_widget.setLayout(main_layout) self.setCentralWidget(central_widget) def set_standard_size(self): try: width = float(self.std_width_input.text()) height = float(self.std_height_input.text()) tolerance = float(self.tolerance_input.text()) / 100 if width <=0 or height <=0 or tolerance <0: raise ValueError("数值必须大于0") self.measurer.set_standard_size(width, height, tolerance) QMessageBox.information(self, '设置成功', f'标准尺寸:{width:.2f}x{height:.2f}cm\n允许误差:±{tolerance*100:.1f}%') except Exception as e: QMessageBox.warning(self, '输入错误', f'请输入有效数值: {str(e)}') def calibrate_system(self): file_path, _ = QFileDialog.getOpenFileName(self, '选择标定图像', '', '图像文件 (*.jpg *.png *.bmp)') if not file_path: return known_width, ok = QInputDialog.getDouble(self, '系统标定', '输入参考物体宽度(cm):', 10, 0, 1000, 2) if not ok: return result, error = self.measurer.calibrate(file_path, known_width) if result: QMessageBox.information(self, '标定成功', f'像素/厘米比例: {result:.2f}') else: QMessageBox.warning(self, '标定失败', error) def select_reference(self, ref_type): if ref_type == '选择参考物体': self.measurer.reference_type = None return if self.measurer.set_reference_type(ref_type): size = self.measurer.STANDARD_SIZES[ref_type] QMessageBox.information(self, '参考设置', f'已选择{ref_type}\n标准尺寸:{size["width"]}x{size["height"]}mm') else: QMessageBox.warning(self, '错误', '无效参考类型') def measure_image(self): if self.camera_thread and self.camera_thread.isRunning(): self.toggle_camera_measurement() file_path, _ = QFileDialog.getOpenFileName(self, '选择测量图像', '', '图像文件 (*.jpg *.png *.bmp)') if not file_path: return image = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR) if image is None: QMessageBox.warning(self, '错误', '无法读取图像') return measurements, annotated_image, error = self.measurer.measure_objects(image) if error: QMessageBox.warning(self, '测量错误', error) return self.current_measurements = measurements self.show_measurement_results(measurements) self.display_image(annotated_image) def show_measurement_results(self, measurements): qualified = [m for m in measurements if m['qualified']] unqualified = [m for m in measurements if not m['qualified']] result_text = "测量结果统计:\n" result_text += f"合格数量:{len(qualified)} | 不合格数量:{len(unqualified)}\n\n" if qualified: result_text += "===== 合格零件 =====\n" for i, m in enumerate(qualified, 1): result_text += f"物体{i}: 宽{m['width_cm']:.2f}cm 高{m['height_cm']:.2f}cm 面积{m['area_cm2']:.2f}cm²\n" if unqualified: result_text += "\n===== 不合格零件 =====\n" for i, m in enumerate(unqualified, 1): result_text += f"物体{i}: 宽{m['width_cm']:.2f}cm 高{m['height_cm']:.2f}cm 面积{m['area_cm2']:.2f}cm²\n" self.result_text.setText(result_text)描述以上代码是如何实现标准尺寸设置模块的
最新发布
05-11
#include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; using namespace cv::ml; // 特征提取函数 vector<float> extractFeatures(Mat img) { resize(img, img, Size(64, 64)); // 统一尺寸 GaussianBlur(img, img, Size(5, 5), 0); // 去噪 Mat hsv; cvtColor(img, hsv, COLOR_BGR2HSV); // 转换色彩空间 // 计算H-S二维直方图 int histSize[] = { 16,16 }; float hRange[] = { 0,180 }, sRange[] = { 0,256 }; const float* ranges[] = { hRange, sRange }; int channels[] = { 0,1 }; Mat hist; calcHist(&hsv, 1, channels, Mat(), hist, 2, histSize, ranges, true, false); normalize(hist, hist, 0, 1, NORM_MINMAX); // 归一化 vector<float> features; features.assign((float*)hist.datastart, (float*)hist.dataend); return features; } int main() { // 加载数据集路径 vector<string> posPaths, negPaths; glob("dataset/qualified/*.jpg", posPaths); glob("dataset/unqualified/*.jpg", negPaths); // 提取特征 vector<vector<float>> features; vector<int> labels; // 处理合格样本 for (auto& path : posPaths) { Mat img = imread(path); if (!img.empty()) { features.push_back(extractFeatures(img)); labels.push_back(1); } } // 处理不合格样本 for (auto& path : negPaths) { Mat img = imread(path); if (!img.empty()) { features.push_back(extractFeatures(img)); labels.push_back(0); } } // 创建训练数据矩阵 Mat trainData(features.size(), features[0].size(), CV_32FC1); for (int i = 0; i < features.size(); ++i) trainData.row(i) = Mat(features[i]).t(); Mat labelsMat(labels); // 创建SVM模型 Ptr<SVM> svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::RBF); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 1000, 1e-6)); // 训练并保存模型 svm->train(trainData, ROW_SAMPLE, labelsMat); svm->save("peanut_model.xml"); cout << "模型训练完成!" << endl; return 0; }把以上程序改成,数据集有good ,atrophy ,spot ,broken ,peeling ,moldy 六个标签,且已经分为了训练集和测试集两组,更改加载数据集
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值