在做图像任务时,会经常需要求取特定矩形框内图像内容,并在此基础上进行下一步操作。典型的应用就是二维码的扫描框。
代码的实现比较简单,我先用一个opencv-python的例子来说明。
im = cv2.imread(img_file)
imNew=im[Ymin:Ymax,Xmin:Xmax] #y1:y2,x1:x2 代表先左上再右下,先y轴再x轴
c++代码实现:
"bmp.h"的头文件代码:bmp图片的类以及读写函数 bmp.h
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#include <cstdio>
#include "bmp.h"
using namespace std;
#define DRAW_HEIGHT 256 //目标图像高度
#define DRAW_WIDTH 256 //目标图像宽度
#define SQUAR_HEIGHT 60 //目标矩形高度
#define SQUAR_WIDTH 80 //目标矩形宽度
int main()
{
BMP rbmp;
BMP wbmp(DRAW_WIDTH,DRAW_HEIGHT);
char strFile[50] = "./lena24.bmp";//打开图像路径,BMP图像必须为24位真彩色格式
char strFilesave[50] = "./test.bmp";//处理后图像存储路径
//读取位图的数据
imread(strFile,rbmp);
int width = rbmp.cols();
int height = rbmp.rows();
int l_width = WIDTHBYTES(width*24);//计算位图的实际宽度并确保它为4byte的倍数
//写位图的数据
int write_width = WIDTHBYTES(DRAW_WIDTH*24);//计算写位图的实际宽度(字节)并确保它为4byte的倍数
/*******************图像处理部分******************/
int x = 112,y=102;//矩形框起始位置
for(int hnum=0;hnum<height;hnum++)
{
for(int wnum=0;wnum<width;wnum++)
{
int pixel_point=hnum*l_width+wnum*3;//数组位置偏移量,对应于图像的各像素点RGB的起点
if(hnum>=y&&hnum<=(y+SQUAR_HEIGHT)&&wnum>=x&&wnum<=(x+SQUAR_WIDTH))
{
wbmp.pColorData[pixel_point]=rbmp.pColorData[pixel_point];
wbmp.pColorData[pixel_point+1]=rbmp.pColorData[pixel_point+1];
wbmp.pColorData[pixel_point+2]=rbmp.pColorData[pixel_point+2];
}
}
}
/*******************图像处理部分******************/
std::cout<<"Done!"<<std::endl;
imwrite(strFilesave,wbmp);
system("pause");
return 0;
}
效果图: