图像处理框架:仅使用OpenCV进行图像的显示、读取、保存;中间图像处理的过程脱离OpenCV,以彩色图像转灰度图像为例进行代码使用的展示。
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
#define EPSILON 1e-15
#define DEMO_SAVE_FILES 0
#define DEMO_IMAGE_PATH "test_image_01.jpg"
#ifndef MAX
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#endif // !MAX
#ifndef MIN
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#endif // !MIN
#ifndef CLAMP
#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z))
#endif // !CLAMP
void safe_release(void** ptr)
{
if (*ptr != NULL)
{
free(*ptr);
*ptr = NULL;
}
}
int main()
{
cout << "OpenCV Version: " << CV_VERSION << endl;
clock_t start = clock();
clock_t end = clock();
#ifdef DEMO_IMAGE_PATH
Mat img_bgr = imread(DEMO_IMAGE_PATH, CV_LOAD_IMAGE_COLOR);
if (img_bgr.empty())
{
cout << "Input image is null!" << endl;
return 0;
}
imshow("img_bgr", img_bgr);
cout << "Channel nmuber: " << img_bgr.channels() << endl;
#endif // DEMO_IMAGE_PATH
start = clock();
/* Add code here! */
int width = img_bgr.cols;
int height = img_bgr.rows;
int channel = img_bgr.channels();
int buffer_size = width * height * channel;
uint8_t* img_bgr_data = NULL;
img_bgr_data = (uint8_t*)calloc(buffer_size, sizeof(uint8_t));
if (img_bgr_data == NULL)
{
printf("calloc img_bgr_data failed!\n");
return 0;
}
memcpy(img_bgr_data, img_bgr.data, buffer_size);
Mat img_out(Size(width, height), CV_MAKETYPE(CV_8U, channel), img_bgr_data);
imshow("img_out", img_out);
uint8_t* img_gray_data = NULL;
img_gray_data = (uint8_t*)calloc(width * height, sizeof(uint8_t));
if (img_gray_data == NULL)
{
printf("calloc img_gray_data failed!\n");
return 0;
}
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int idx_1 = y * width + x;
int idx_3 = idx_1 * channel;
/* gray = (1868 * b + 9617 * g + 4899 * r) >> 14 */
img_gray_data[idx_1] = CLAMP((1868 * img_bgr_data[idx_3 + 0] + 9617 * img_bgr_data[idx_3 + 1] + 4899 * img_bgr_data[idx_3 + 2]) >> 14, 0, 255);
}
}
Mat img_out_gray(Size(width, height), CV_MAKETYPE(CV_8U, 1), img_gray_data);
imshow("img_out_gray", img_out_gray);
safe_release((void**)&img_bgr_data);
safe_release((void**)&img_gray_data);
end = clock();
printf("Function run consum time: %dms\n", end - start);
waitKey(0);
return 0;
}