设为首页收藏本站 距【华南国际工业博览会】延期开幕 : :

Halcon视觉之家 - 51Halcon专注于机器视觉技术

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 306|回复: 0

[OpenCV] 如何自定义棋盘格尺寸啊?

[复制链接]

该用户从未签到

1

主题

2

帖子

5

积分

Rank: 1

积分
5
发表于 2020-11-26 21:35:39 | 显示全部楼层 |阅读模式

51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

您需要 登录 才可以下载或查看,没有帐号?会员注册

x
我想自定义棋盘格尺寸然后打印出来,网上找了代码,但是打印出来的尺寸和我设置的有出入,想知道大家是如何做的??(救救孩子吧)以下是我从网上下载的代码
#include <iostream>
#include <fcntl.h>
#include <io.h>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

//// method from https://blog.csdn.net/shirly_xr/article/details/83792028
bool SetResolution(const char* path, int iResolution)
{
    FILE * file = fopen(path, "rb+");// - 打开图片文件
    if (!file)return false;
    int len = _filelength(_fileno(file));// - 获取文件大小
    char* buf = new char[len];
    fread(buf, sizeof(char), len, file);// - 将图片数据读入缓存
    char * pResolution = (char*)&iResolution;// - iResolution为要设置的分辨率的数值,如72dpi                                         
    buf[0x0D] = 1;// - 设置使用图片密度单位
    // - 水平密度,水平分辨率
    buf[0x0E] = pResolution[1];
    buf[0x0F] = pResolution[0];
    // - 垂直密度,垂直分辨率
    buf[0x10] = pResolution[1];
    buf[0x11] = pResolution[0];

    // - 将文件指针移动回到文件开头
    fseek(file, 0, SEEK_SET);
    // - 将数据写入文件,覆盖原始的数据,让修改生效
    fwrite(buf, sizeof(char), len, file);
    fclose(file);
    return true;
}

int main() {

    //自定义标定板
    int blockSize_mm =10;    // block边长,单位:mm
    int blockNum =10;          // 行
    int blockNum_col = 7;      // 列


    int resolution_ratio = 10;
    int blockSize_pixel = blockSize_mm * resolution_ratio;
    int edge_size_pixel = blockSize_pixel / 2;

    int imageSize = blockSize_pixel * blockNum;

    int imageSize_col = blockSize_pixel * blockNum_col;
    cout << " imageSize = " << imageSize << endl;
    Mat chessBoard = cv::Mat::zeros(imageSize, imageSize_col, CV_8UC1);

    cout << "chessBoard.size() = " << chessBoard.size() << endl;

    for (int i = 0; i < imageSize_col; i = i + blockSize_pixel) {  // 列

        for (int j = 0; j < imageSize; j = j + blockSize_pixel) {
            Mat ROI = chessBoard(Rect(i, j, blockSize_pixel, blockSize_pixel));
            if (((i + j) / blockSize_pixel) % 2 == 0)
                ROI.setTo(Scalar::all(0));
            else
                ROI.setTo(Scalar::all(255));
        }
    }

    Mat chessBoard_final = cv::Mat::zeros((imageSize + blockSize_pixel), (imageSize_col + blockSize_pixel), CV_8UC1);

    chessBoard_final.setTo(Scalar::all(255));

    Rect chessBoard_rect = Rect(edge_size_pixel, edge_size_pixel, imageSize_col, imageSize);

    cout << "chessBoard_final.size() = " << chessBoard_final.size() << endl;

    //chessBoard_final(chessBoard_rect) = chessBoard;

    chessBoard.copyTo(chessBoard_final(chessBoard_rect));
    imshow("Chess board", chessBoard_final);
    imwrite("chessBoard.jpg", chessBoard_final);

    int iResolution = 254;      // 图像分辨率
    char path[20] = "./chessBoard.jpg";
    SetResolution(path, iResolution);

    waitKey(3000);
    return 0;
}
求大神指教哈

1.发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

2.提问请组织好自己的逻辑,标题注明大概是什么问题,问题内容写详细,需提供问题症状、错误代码、截图、位置等等信息,不要让别人去猜你想问啥;

3.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

4.回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

视觉培训招生

建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站

51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用

算子查询| 申请友链| 小黑屋| 手机版| Archiver|

© 2015-2021 51Halcon机器视觉  X3.4  粤ICP备15095995号-2 粤公网安备44030602000670号

快速回复 返回顶部 返回列表