【原】将图像放在buf中统一写入文件

本文解析了一段关于图片序列处理的代码片段,该代码利用OpenCV库实现了图片的读取、展示及保存功能。通过分析代码流程,可以了解如何使用C++结合OpenCV进行基本的图片操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// vMat.push_back(img);
//
//// imshow("1", Mat());
// if (_kbhit() && 'y' == _getch())
// {
// char chInput[512];
// for (lFrameCount = 0; lFrameCount < vMat.size(); lFrameCount++)
// {
// sprintf_s(chInput, "%d.jpg", lFrameCount);
// imwrite(chInput, vMat[lFrameCount]);
//
// }
// exit(0);
// }
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <pthread.h> #include "m0.h" #include "camera.h" #define DATALEN 36 #define BUFFER_SIZE 1024 #define IMAGE_HEADER_SIZE 20 int new_fd; // 全局变量用于线程间共享套接字 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 发送数据线程函数 void* send_thread(void* arg) { int ret; char write_buf[60] = {0}; char m0_read_buf[DATALEN] = {0}; float temp = 0; float humi = 0; while(1) { // 加锁保护套接字写操作 pthread_mutex_lock(&mutex); // 读取传感器数据 m0_read(m0_read_buf); temp = m0_read_buf[5] + m0_read_buf[4] / 10.0; humi = m0_read_buf[7] + m0_read_buf[6] / 10.0; printf("\ntemp: %.2f度\nhumi: %.2f%%\n", temp, humi); sprintf(write_buf, "temp:%.2f度\nhumi:%.2f%%\n", temp, humi); //ret = write(new_fd, write_buf, strlen(write_buf)); pthread_mutex_unlock(&mutex); /* if(ret <= 0) { perror("发送失败"); break; } */ // 定时发送(每2秒) sleep(2); } return NULL; } // 接收数据线程函数 void* recv_thread(void* arg) { int ret; char lead_buf[2] = {0}; // 增加缓冲区大小防止溢出 char m0_send_buf[DATALEN] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 }; // 控制命令 while(1) { // 加锁保护套接字读操作 pthread_mutex_lock(&mutex); ret = read(new_fd, lead_buf, sizeof(lead_buf) - 1); // 保留个字节给结束符 pthread_mutex_unlock(&mutex); if(ret <= 0) { perror("接收失败或连接关闭"); break; } lead_buf[ret] = '\0'; // 确保字符串终止 printf("接收到命令: %s\n", lead_buf); int n = atoi(lead_buf); if(n >= 0 && n <= 8) { char buf = m0_send_buf[0]; ret = m0_write(buf); if(ret < 0) { perror("M0写入失败"); } } else { printf("无效命令: %d\n", n); } } return NULL; } void* camera_thread() { int opt = 1; char buffer[BUFFER_SIZE] = {0}; Camera_Init(); while (1) { // 7. 执行摄像头程序捕获图像 printf("正在捕获图像...\n"); capture_frame(); // 8. 读取捕获的图片 FILE *img_file = fopen("captured.jpg", "rb"); if (!img_file) { perror("打开图片失败"); close(new_fd); continue; } // 获取文件大小 fseek(img_file, 0, SEEK_END); long img_size = ftell(img_file); fseek(img_file, 0, SEEK_SET); // 加锁保护套接字读操作 pthread_mutex_lock(&mutex); // 9. 发送图片大小头信息 char header[IMAGE_HEADER_SIZE]; snprintf(header, IMAGE_HEADER_SIZE, "%019ld", img_size); // 19位数字+1个结束符 if (send(new_fd, header, IMAGE_HEADER_SIZE, 0) != IMAGE_HEADER_SIZE) { perror("发送头信息失败"); fclose(img_file); close(new_fd); continue; } printf("发送图片大小: %ld 字节\n", img_size); //发送图片数据 size_t total_sent = 0; while (total_sent < (size_t)img_size) { size_t bytes_read = fread(buffer, 1, BUFFER_SIZE, img_file); if (bytes_read <= 0) break; ssize_t bytes_sent = send(new_fd, buffer, bytes_read, 0); if (bytes_sent <= 0) { perror("发送图片失败"); break; } total_sent += bytes_sent; printf("已发送: %zd/%ld 字节 (%.1f%%)\r", total_sent, img_size, (double)total_sent/img_size*100); fflush(stdout); } pthread_mutex_unlock(&mutex); printf("\n图片发送完成\n"); fclose(img_file); } } int main(void) { int fd, ret; struct sockaddr_in addr; // 创建套接字 fd = socket(AF_INET, SOCK_STREAM, 0); if(fd < 0) { perror("创建套接字失败"); return fd; } printf("创建套接字成功\n"); // 设置地址重用 int opt = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定地址 addr.sin_family = AF_INET; addr.sin_port = htons(60000); addr.sin_addr.s_addr = INADDR_ANY; ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr)); if(ret < 0) { perror("绑定失败"); close(fd); return ret; } printf("绑定成功\n"); // 监听 ret = listen(fd, 5); if(ret < 0) { perror("监听失败"); close(fd); return ret; } printf("等待客户端连接...\n"); // 接受连接 socklen_t addrlen = sizeof(addr); new_fd = accept(fd, (struct sockaddr*)NULL, NULL); if(new_fd < 0) { perror("接受连接失败"); close(fd); return new_fd; } printf("客户端连接成功\n"); // 创建发送和接收线程 pthread_t send_tid, recv_tid,camera_tid; if(pthread_create(&send_tid, NULL, send_thread, NULL) != 0) { perror("发送线程创建失败"); close(new_fd); close(fd); return -1; } if(pthread_create(&recv_tid, NULL, recv_thread, NULL) != 0) { perror("接收线程创建失败"); close(new_fd); close(fd); return -1; } if(pthread_create(&camera_tid, NULL, camera_thread, NULL) != 0) { perror("摄像线程创建失败"); close(new_fd); close(fd); return -1; } // 等待线程结束 pthread_join(send_tid, NULL); pthread_join(camera_tid,NULL); pthread_join(recv_tid, NULL); // 清理资源 close(new_fd); close(fd); pthread_mutex_destroy(&mutex); return 0; } 这是段TCP服务端的代码,帮我把三个任务改写为互不阻塞,以达到客户端定时更新接收到服务端数据的同时可以即时发送数据给服务端,还要整个服务端函数不会阻塞在read接收客户端数据的时候,即类似单片机中断的理,同时在send_thread()和camera_thread()中增加帧头,以达到发送给数据时客户端可以分辨是哪种数据
06-26
int decode_libpics(DEC_CDSC * cdsc, LibVCData* libvc_data) { STATES state_lib = STATE_DECODING; unsigned char * bs_buf_lib = NULL; unsigned char * bs_buf_lib2 = NULL; DEC id_lib = NULL; COM_BITB bitb_lib; COM_IMGB * imgb_lib; DEC_STAT stat_lib; int ret; COM_CLK clk_beg_lib, clk_tot_lib; int bs_cnt_lib, pic_cnt_lib; int bs_size_lib, bs_read_pos_lib = 0; int width_lib, height_lib; FILE * fp_bs_lib = NULL; #if LINUX signal(SIGSEGV, handler); // install our handler #endif #if DECODING_TIME_TEST clk_beg_lib = com_clk_get(); #endif /* open input bitstream */ fp_bs_lib = fopen(op_fname_inp_libpics, "rb"); if (fp_bs_lib == NULL) { v0print("ERROR: cannot open libpics bitstream file = %s\n", op_fname_inp_libpics); print_usage(); return -1; } if (op_flag[OP_FLAG_FNAME_OUT_LIBPICS]) { /* remove decoded file contents if exists */ FILE * fp; fp = fopen(op_fname_out_libpics, "wb"); if (fp == NULL) { v0print("ERROR: cannot create a decoded libpics file\n"); print_usage(); return -1; } fclose(fp); } bs_buf_lib = malloc(MAX_BS_BUF); if (bs_buf_lib == NULL) { v0print("ERROR: cannot allocate bit buffer, size=%d\n", MAX_BS_BUF); return -1; } bs_buf_lib2 = malloc(MAX_BS_BUF); if (bs_buf_lib2 == NULL) { v0print("ERROR: cannot allocate bit buffer, size2=%d\n", MAX_BS_BUF); return -1; } #if CU_LEVEL_PRIVACY unsigned char *bs_buf_lib3 = malloc(MAX_BS_BUF); if (bs_buf_lib3 == NULL) { v0print("ERROR: cannot allocate bit buffer, size2=%d\n", MAX_BS_BUF); return -1; } #endif #if SVAC_UD_MD5_STREAM unsigned char * bs_buf4 = NULL; unsigned char * bs_buf5 = NULL; bs_buf5 = malloc(MAX_BS_BUF); if (bs_buf5 == NULL) { v0print("ERROR: cannot allocate bit buffer, size=%d\n", MAX_BS_BUF); return -1; } bitb_lib.addr3 = bs_buf5; bitb_lib.addr3_beg = bs_buf5; bs_buf4 = malloc(MAX_BS_BUF); if (bs_buf4 == NULL) { v0print("ERROR: cannot allocate bit buffer, size=%d\n", MAX_BS_BUF); return -1; } unsigned char * buf4_p = bs_buf4; unsigned char * buf4_beg = bs_buf4; #endif id_lib = dec_create(cdsc, NULL); if (id_lib == NULL) { v0print("ERROR: cannot create decoder\n"); return -1; } set_livcdata_dec(id_lib, libvc_data); if (set_extra_config(id_lib)) { v0print("ERROR: cannot set extra configurations\n"); return -1; } pic_cnt_lib = 0; clk_tot_lib = 0; bs_cnt_lib = 0; width_lib = height_lib = 0; #if CU_LEVEL_PRIVACY int bs_buf3_size = 0; #endif while (1) { if (state_lib == STATE_DECODING) { bs_size_lib = read_a_bs(fp_bs_lib, &bs_read_pos_lib, bs_buf_lib, bs_buf_lib2 #if CU_LEVEL_PRIVACY , bs_buf_lib3, &bs_buf3_size #endif #if SVAC_UD_MD5_STREAM , &bitb_lib #endif ); if (bs_size_lib <= 0) { state_lib = STATE_BUMPING; v1print("bumping process starting...\n"); continue; } bs_read_pos_lib += (bs_size_lib); bitb_lib.addr = bs_buf_lib; bitb_lib.ssize = bs_size_lib; bitb_lib.bsize = MAX_BS_BUF; #if CU_LEVEL_PRIVACY bitb_lib.addr2 = bs_buf_lib3; bitb_lib.ssize2 = bs_buf3_size; #endif #if !DECODING_TIME_TEST clk_beg_lib = com_clk_get(); #endif /* main decoding block */ ret = dec_cnk((DEC_CTX *)id_lib, &bitb_lib, &stat_lib); if (COM_FAILED(ret)) { v0print("failed to decode bitstream\n"); return -1; } #if !DECODING_TIME_TEST clk_tot_lib += com_clk_from(clk_beg_lib); #endif } if (stat_lib.fnum >= 0 || state_lib == STATE_BUMPING) { ret = dec_pull_frm((DEC_CTX *)id_lib, &imgb_lib, state_lib); if (ret == COM_ERR_UNEXPECTED) { v1print("bumping process completed\n"); goto END; } else if (COM_FAILED(ret)) { v0print("failed to pull the decoded image\n"); return -1; } } else { imgb_lib = NULL; } if (imgb_lib) { width_lib = imgb_lib->width[0]; height_lib = imgb_lib->height[0]; if (op_flag[OP_FLAG_FNAME_OUT_LIBPICS]) { write_dec_img(id_lib, op_fname_out_libpics, imgb_lib, ((DEC_CTX *)id_lib)->info.bit_depth_internal); } imgb_lib->release(imgb_lib); pic_cnt_lib++; } } END: #if DECODING_TIME_TEST clk_tot_lib += com_clk_from(clk_beg_lib); #endif libvc_data->num_lib_pic = pic_cnt_lib; #if CU_LEVEL_PRIVACY if (bs_buf_lib3) { free(bs_buf_lib3); bs_buf_lib3 = NULL; } #endif if (id_lib) dec_delete(id_lib); if (fp_bs_lib) fclose(fp_bs_lib); if (bs_buf_lib) free(bs_buf_lib); return 0; } #endif
最新发布
07-16
要将指针`rgb_buf`的值写入地址`inbuff`,您需要执行以下步骤: 1. 确保`inbuff`指向个有效的内存地址,并且具有足够的空间来容纳`rgb_buf`中的数据。 2. 将`rgb_buf`中的数据复制到`inbuff`指向的内存区域中。您可以使用指针运算符(例如`*`)来访问和修改指针所指向的数据。 下面是个示例代码片段,展示了如何将`rgb_buf`的值写入`inbuff`: ```c // 假设 rgb_buf 是指向数据的指针,inbuff 是目标内存地址 // 将 rgb_buf 中的数据复制到 inbuff 指向的内存区域中 // 确保 inbuff 指向有效的内存地址,且有足够的空间容纳 rgb_buf 中的数据 void* inbuff_ptr = malloc(sizeof(rgb_buf)); // 根据实际数据类型和大小进行修改 if (inbuff_ptr == NULL) { // 处理内存分配失败的情况 exit(1); // 退出程序 } // 将 rgb_buf 中的数据复制到 inbuff 指向的内存区域中 memcpy(inbuff_ptr, rgb_buf, sizeof(rgb_buf)); // 根据实际数据类型和大小进行修改 ``` 请注意,上述代码片段使用了`memcpy()`函数来将数据从`rgb_buf`复制到`inbuff`。您需要确保使用正确的数据类型和大小参数来匹配`rgb_buf`和`inbuff`的实际数据结构和大小。 请注意,在完成操作后,您应该释放分配给`inbuff`的内存,以避免内存泄漏。可以使用`free()`函数来完成此操作: ```c free(inbuff_ptr); // 释放内存 ``` 请根据您的具体需求和环境进行适当的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值