DCMTK c-find简单示例

发布时间 2023-11-21 11:15:00作者: 奇迹之耀

DcmSCU scu;
//设置连接信息
scu.setPeerAETitle(serverAETitle);
scu.setPeerHostName(serverHost);
scu.setPeerPort(serverPort);
scu.setAETitle(clientAETitle);

//设置协议上下文 传输编码格式
OFList<OFString> ts;
ts.push_back(UID_LittleEndianImplicitTransferSyntax);
ts.push_back(UID_LittleEndianExplicitTransferSyntax);
ts.push_back(UID_BigEndianExplicitTransferSyntax);

scu.addPresentationContext(UID_VerificationSOPClass, ts); //验证服务该服务是必须的

/* Initialize network */
OFCondition result = scu.initNetwork();
DcmFileFormat dcmff;
DcmDataset* dset = dcmff.getDataset();
dset->putAndInsertString(DCM_QueryRetrieveLevel, "PATIENT");
dset->putAndInsertString(DCM_PatientName, "*");
dset->putAndInsertString(DCM_SpecificCharacterSet, "ISO_IR 192");
Uint8 pc;
T_ASC_PresentationContextID presID = scu.findPresentationContextID(UID_VerificationSOPClass, UID_JPEGProcess1TransferSyntax);
if (presID == 0)
presID = scu.findPresentationContextID(UID_VerificationSOPClass, UID_LittleEndianImplicitTransferSyntax);
if (presID == 0)
presID = scu.findPresentationContextID(UID_VerificationSOPClass, UID_LittleEndianExplicitTransferSyntax);
if (presID == 0)
presID = scu.findPresentationContextID(UID_VerificationSOPClass, UID_BigEndianExplicitTransferSyntax);
OFList<QRResponse*> responses;
//查询
result = scu.sendFINDRequest(presID, dset, &responses);

if (result.good())
{
int asdasd = responses.size();
for (OFListIterator(QRResponse*) it = responses.begin(); it != responses.end(); ++it) {
QRResponse* response = *it;

// 获取DICOM数据集
DcmDataset* dataset = response->m_dataset;
if (dataset == nullptr)
{
continue;
}
// 从数据集中获取病人姓名
OFString patientName;
if (dataset->findAndGetOFString(DCM_PatientName, patientName).good()) {

// 处理病人姓名
std::cout << "Patient Name: " << patientName << std::endl;
}
// 可以继续从数据集中获取其他病人相关的信息
}
}