图像处理基本方法-在BMP图片上画矩形-c语言调用opencv实现
之前使用过c语言调用opencv实现生成纯色BMP文件的功能。
这次使用c语言调用opencv在bmp图片上画矩形。
主要还是使用opencv的cvRectangle函数实现。
具体函数调用
cvRectangle(testImage,
cvPoint(iStartX, iStartY),
cvPoint(iEndX, iEndY),
cvScalar(u8B, u8G, u8R),
1
);
其中testImage为图像文件。
cvPoint(iStartX, iStartY)为左上角的坐标。
cvPoint(iEndX, iEndY)为右下角的坐标。
cvScalar(u8B, u8G, u8R)颜色信息。
代码实现
/*******************************************************
* file:testOpenCvRectangle.c
* date:2021-06-05
* version:1.0.0.1
* author:jack8126
* description: bmp file, draw a rectangular picture
*******************************************************/
#include <stdio.h>
#include "opencv2/opencv.hpp"
int main(int argc, char * * argv)
{
char u8PicNameRead[64] = {0};
char u8PicNameOut[64] = {0};
int iStartX = 0;
int iStartY = 0;
int iEndX = 0;
int iEndY = 0;
int iWidth = 0;
int iHeigth = 0;
unsigned char u8R = 0;
unsigned char u8G = 0;
unsigned char u8B = 0;
if(argc < 10)
{
printf("please input like this:\r\n");
printf("./testRectangle.bin test.bmp test-out.bmp 200 180 390 420 255 255 255 \r\n");
printf("test.bmp ---------- input file \r\n");
printf("test-out.bmp ----------output file \r\n");
printf("200 --------------- start x \r\n");
printf("180 ---------------- start y \r\n");
printf("390 -----------------end x\r\n");
printf("420 ---------------- end y \r\n");
printf("255 ---------------- B \r\n");
printf("255 ---------------- G \r\n");
printf("255 ---------------- R \r\n");
return -1;
}
sprintf(u8PicNameRead,"%s",argv[1]);
sprintf(u8PicNameOut,"%s",argv[2]);
printf("u8PicNameRead=%s\r\n",u8PicNameRead);
iStartX = atoi(argv[3]);
iStartY = atoi(argv[4]);
iEndX = atoi(argv[5]);
iEndY = atoi(argv[6]);
u8R = atoi(argv[7]);
u8G = atoi(argv[8]);
u8B = atoi(argv[9]);
printf("iStartX = %d\r\n",iStartX);
printf("iStartY = %d\r\n",iStartY);
printf("iEndX = %d\r\n",iEndX);
printf("iEndY = %d\r\n",iEndY);
printf("u8R = %d\r\n",u8R);
printf("u8G = %d\r\n",u8G);
printf("u8B = %d\r\n",u8B);
IplImage * testImage = cvLoadImage( ( const char*)u8PicNameRead, 1);
cvRectangle(testImage,
cvPoint(iStartX, iStartY),
cvPoint(iEndX, iEndY),
cvScalar(u8B, u8G, u8R),
1
);
cvSaveImage(u8PicNameOut, testImage,0);
cvReleaseImage(&testImage);
return 0;
}
makefile文件
#############################################################################
CROSS_COMPILE =
CC = $(CROSS_COMPILE)gcc -g
CPP = $(CROSS_COMPILE)g++
CXX = $(CROSS_COMPILE)g++
AR = $(CROSS_COMPILE)ar
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
RM = rm
MAKE = @make
MKDIR = mkdir -p
COPY = @copy
CD = @cd
ECHO = @echo
ZIP = @gzip
PWD_DIR := $(shell pwd)
#OPENCV_BASE_DIR := $(PWD_DIR)/../output/
OPENCV_BASE_DIR := /usr/local/
OPENCV_DIR := -I$(OPENCV_BASE_DIR)/include
OPENCV1_DIR := -I$(OPENCV_BASE_DIR)/include/opencv
OPENCV2_DIR := -I$(OPENCV_BASE_DIR)/include/opencv2
OPENCV_LIB_DIR := -L$(OPENCV_BASE_DIR)lib/
OPENCV_LIB_DIR2 := -L$(OPENCV_BASE_DIR)lib/
OPENCV_LIBS := $(OPENCV_LIB_DIR)libopencv_highgui.a\
$(OPENCV_LIB_DIR)libopencv_core.a\
$(OPENCV_LIB_DIR)libopencv_imgproc.a\
$(OPENCV_LIB_DIR)libopencv_objdetect.a
INC_FLAGS := $(OPENCV_DIR) $(OPENCV1_DIR) $(OPENCV2_DIR)
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
#TARGET := $(OBJ:%.o=%)
TARGET := testOpenCvRectangle.bin
.PHONY : clean all
all : testBmpCv.bin
testBmpCv.bin:
$(CXX) testOpenCvRectangle.c $(INC_FLAGS) $(OPENCV_LIB_DIR2) -fPIC -lpthread -lz -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect -o $(TARGET) $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) $(TARGET)
编译程序
编译命令如下
make
执行完上述命令之后,会生成testOpenCvRectangle.bin文件,后面执行程序时需要该文件。
执行程序
使用如下命令执行程序,在bmp图片上完成矩形图形的绘制。
./testOpenCvRectangle.bin image.bmp image-out.bmp 200 180 390 420 0 0 255
执行完上述命令后,生成image-out.bmp文件。
如想修改矩形的大小,修改上述200 180 390 420数字即可。
如想修改矩形的颜色,修改上述0 0 255的色彩信息即可。
原图
绘制矩形之后的图片