制作棋盘格标定板(固定分辨率解决尺度问题)

分辨率设置为254dpi

// make_chessboard.cpp
#include <fcntl.h>
#include <iostream>
#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));  // - 获取文件大小
  int len = ftell(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 = 30;  // block边长,单位:mm
  int blockNum = 7;       // 行
  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.png", chessBoard_final);

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

  waitKey(3000);
  return 0;
}

栗子 9*13 60mm:
在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值