linux 利用共享内存 在进程间传递图像

cmakelists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(test_share)
find_package(OpenCV 3 REQUIRED)
include_directories(
  ${CMAKE_CURRENT_LIST_DIR}
)
message(STATUS ${CMAKE_CURRENT_LIST_DIR})
file(GLOB_RECURSE mains ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
message(STATUS ${mains})
foreach(mainfile IN LISTS mains)
    # Get file name without directory
    get_filename_component(mainname ${mainfile} NAME_WE)
    add_executable(${mainname} ${mainfile})
    target_link_libraries(${mainname} ${OpenCV_LIBS})
endforeach()

data_struct

#ifndef DATA_STRUCT_H
#include <sys/shm.h>
#define DATA_STRUCT_H
#define BUF_WIDTH 1280
#define BUF_HEIGHT 960
#define BUF_CHANNEL 3
#define BUF_IMAGE_SIZE BUF_WIDTH*BUF_HEIGHT*BUF_CHANNEL
#define SHM_KEY 2323
struct ShareData {
    int flag;
    int x,y,z;
    char ch_data[BUF_IMAGE_SIZE];
};
int shmid = shmget((key_t)SHM_KEY, sizeof(ShareData), 0666|IPC_CREAT);
void *shm = shmat(shmid, (void*)0, 0);
ShareData *shareData = (ShareData*)shm;
#endif // DATA_STRUCT_H

writer

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "data_struct.h"
int main(void){
    std::cout<<shareData->flag<<std::endl;
    std::cout<<BUF_IMAGE_SIZE;
    shareData->flag=0;
    int i=0;
    while(1)
    {
        i++;
        while(shareData->flag == 0)
        {
            getchar();
            cv::Mat Img=cv::imread("/home/wby/Pictures/saveImg/0000_rgb.jpg",cv::IMREAD_COLOR);
            int size = Img.cols * Img.rows * Img.channels();
            std::cout<<size;
            if(Img.data== nullptr)//nullptr是c++11新出现的空指针常量
            {
             printf("图片文件不存在\n");
             return 0;
             }
            printf("Memory attached at %p\n", (int *)(shm));
//            char *from = (char*)Img.data;
            shareData->x=i;
//            memcpy(shareData->ch_data, from, size);
            shareData->flag = 1;
        }
    }
    shmdt(shm);
    return 0;
}

reader

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include "data_struct.h"
int main(void)
    {
        while(1)
        {
            if(shareData->flag == 1)
            {
                std::cout<<shareData->x<<std::endl;
//                            cv::Mat cvoutImg = cv::Mat(BUF_HEIGHT,BUF_WIDTH,CV_8UC3,cv::Scalar(255, 255, 255));//bufHight,bufWidth
//                            int size = cvoutImg.cols * cvoutImg.rows * cvoutImg.channels();
//                            memcpy((char*)cvoutImg.data, shareData->ch_data,size);
//                            cv::imshow("xx",cvoutImg);
//                            cv::waitKey(1000);
                shareData->flag = 0;
            }
            usleep(100);
        }
        shmdt(shm);
        shmctl(shmid, IPC_RMID, 0);
	return 0;
}
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值