C++ 读取的dxf文件并用OpenCV绘制出来
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
免费下载资源
·
正文开始,C++注释很详细,只写了识别块的单层嵌套,只要了解一些DXF文件格式,就可以根据这个例子修改,可以读出线、圆、等等,直接贴源码
稍后会把整个工程上传,里面包含测试文件等等
//读线,包括块中的线
void DXFRead::ReadLine(CADDATA &data)
{
FILE* fp = fopen(FILENAME, "r");
if (!fp)
{
cout << "读取" << FILENAME << "失败,任意键退出" << endl;
getchar();
exit(0);
}
else
{
cout << "打开" << FILENAME << "成功,正在读取LINE..." << endl;
}
while (!feof(fp) && !ferror(fp))
{
fscanf(fp, "%s", &str);
//扫描块中线
if (strcmp(str, "BLOCK") == 0)
{
fscanf(fp, "%s", &str);
while (strcmp(str, "2") != 0)
{
fscanf(fp, "%s", &str);
}
//获得块名字
fscanf(fp, "%s", &name);
//如果不是这两个块,做记录
if (strcmp(name,"$MODEL_SPACE") != 0
&& strcmp(name, "$PAPER_SPACE") != 0)
{
while (strcmp(str, "ENDBLK") != 0)
{
fscanf(fp, "%s", &str);
//扫描块中线
if (strcmp(str, "LINE") == 0)
{
//归属块
strcpy(tempLine.name, name);
//x1
while (strcmp(str, "10") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.x1 = atof(str);
//y1
while (strcmp(str, "20") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.y1 = atof(str);
//z1
while (strcmp(str, "30") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.z1 = atof(str);
//x2
while (strcmp(str, "11") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.x2 = atof(str);
//y2
while (strcmp(str, "21") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.y2 = atof(str);
//z2
while (strcmp(str, "31") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.z2 = atof(str);
data.LINE.Add(new LINEPoint(tempLine));
}
}
}
}
//扫描主坐标系线
else if (strcmp(str, "LINE") == 0)
{
//归属块
strcpy(tempLine.name, "ReferenceBlock");
//x1
while (strcmp(str, "10") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.x1 = atof(str);
//y1
while (strcmp(str, "20") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.y1 = atof(str);
//z1
while (strcmp(str, "30") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.z1 = atof(str);
//x2
while (strcmp(str, "11") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.x2 = atof(str);
//y2
while (strcmp(str, "21") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.y2 = atof(str);
//z2
while (strcmp(str, "31") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempLine.z2 = atof(str);
data.LINE.Add(new LINEPoint(tempLine));
}
}
cout << "LINE读取完毕..." << endl;
fclose(fp);
}
2、读块的插入信息
void DXFRead::ReadInsert(CADDATA &data)
{
FILE* fp = fopen(FILENAME, "r");
fp = fopen(FILENAME, "r");
if (!fp)
{
cout << "读取" << FILENAME << "失败,任意键退出" << endl;
getchar();
exit(0);
}
else
{
cout << "打开" << FILENAME << "成功,正在读取BLOCK插入信息..." << endl;
}
while (!feof(fp) && !ferror(fp))
{
fscanf(fp, "%s", &str);
if (strcmp(str, "INSERT") == 0)
{
//读取插入块名字
while (strcmp(str, "2") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
strcpy(tempBlock.name, str);
//基点坐标
//rx
while (strcmp(str, "10") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.rx = atof(str);
//ry
while (strcmp(str, "20") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.ry = atof(str);
//rz
while (strcmp(str, "30") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.rz = atof(str);
//读取比例因子
//cx
while (strcmp(str, "41") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.cx = atof(str);
//cy
while (strcmp(str, "42") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.cy = atof(str);
//cz
while (strcmp(str, "43") != 0)
{
fscanf(fp, "%s", &str);
}
fscanf(fp, "%s", &str);
tempBlock.cz = atof(str);
data.BLOCK.Add(new BLOCKPoint(tempBlock));
}
}
cout << "BLOCK插入信息读取完毕..." << endl;
fclose(fp);
}
3、绘图
void DXFRead::DrawImage(CADDATA &data)
{
LINEPoint* linep = NULL;
BLOCKPoint* blockp = NULL;
uchar* Img = NULL;
cout << "开始绘图..." << endl;
//创建图像,深度为8,3通道RGB图像
cvImg = cvCreateImage(cvSize(15000, 15000), 8, 3);
Img = (uchar*) cvImg->imageData;
int step = cvImg->widthStep / sizeof(uchar);
int channels = cvImg->nChannels;
//清空图像
for (int i = 0; i<cvImg->height; i++)
for (int j = 0; j<cvImg->width; j++) {
Img[i * step + j * channels + 0] = 0;
Img[i * step + j * channels + 1] = 0;
Img[i * step + j * channels + 2] = 0;
}
for (int i = 0; i<data.LINE.GetCount(); i++)
{
linep = (LINEPoint*) data.LINE.GetAt(i);
//如果是正常线
if (strcmp(linep->m_line.name, "ReferenceBlock") == 0 )
{
cvLine(cvImg,
cvPoint(20 * ((linep->m_line.x1) + 300), 20 * ((linep->m_line.y1) + 300)),
cvPoint(20 * ((linep->m_line.x2) + 300), 20 * ((linep->m_line.y2) + 300)),
CV_RGB(0, 255, 0), 4);
}
else
{
for (int j = 0; j<data.BLOCK.GetCount(); j++)
{
//获取线归属块信息
blockp = (BLOCKPoint*) data.BLOCK.GetAt(j);
if (strcmp(linep->m_line.name, blockp->m_block.name) == 0)
{
cvLine(cvImg,
cvPoint(20 * ((blockp->m_block.cx) * (linep->m_line.x1) + blockp->m_block.rx + 300), 20 * ((blockp->m_block.cy) * (linep->m_line.y1) + blockp->m_block.ry + 300 ) ),
cvPoint(20 * ((blockp->m_block.cx) * (linep->m_line.x2) + blockp->m_block.rx + 300), 20 * ((blockp->m_block.cy) * (linep->m_line.y2) + blockp->m_block.ry + 300 ) ),
CV_RGB(0, 255, 0), 4);
}
}
}
}
cvSaveImage(SAVENAME, cvImg);
//释放图像所占的内存
cvReleaseImage(&cvImg);
}
GitHub 加速计划 / opencv31 / opencv
142
15
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:3 个月前 )
d9a139f9
Animated WebP Support #25608
related issues #24855 #22569
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
1 天前
09030615
V4l default image size #25500
Added ability to set default image width and height for V4L capture. This is required for cameras that does not support 640x480 resolution because otherwise V4L capture cannot be opened and failed with "Pixel format of incoming image is unsupported by OpenCV" and then with "can't open camera by index" message. Because of the videoio architecture it is not possible to insert actions between CvCaptureCAM_V4L::CvCaptureCAM_V4L and CvCaptureCAM_V4L::open so the only way I found is to use environment variables to preselect the resolution.
Related bug report is [#25499](https://github.com/opencv/opencv/issues/25499)
Maybe (but not confirmed) this is also related to [#24551](https://github.com/opencv/opencv/issues/24551)
This fix was made and verified in my local environment: capture board AVMATRIX VC42, Ubuntu 20, NVidia Jetson Orin.
### Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [X] I agree to contribute to the project under Apache 2 License.
- [X] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [X] The PR is proposed to the proper branch
- [X] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
1 天前
更多推荐
已为社区贡献1条内容
所有评论(0)