update software sim
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -11,4 +11,6 @@
 | 
			
		||||
*.bin
 | 
			
		||||
*.dat
 | 
			
		||||
*.png
 | 
			
		||||
!im.tif
 | 
			
		||||
!im.tif
 | 
			
		||||
*.bmp
 | 
			
		||||
*.out
 | 
			
		||||
							
								
								
									
										12
									
								
								Crop/crop.v
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Crop/crop.v
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
module crop #(
 | 
			
		||||
    parameter IN_WIDTH = 1936,
 | 
			
		||||
    parameter IN_HEIGHT = 1088,
 | 
			
		||||
    parameter IN_WIDTH = 1934,
 | 
			
		||||
    parameter IN_HEIGHT = 1086,
 | 
			
		||||
    parameter OFFSET_X = 8,
 | 
			
		||||
    parameter OFFSET_Y = 4,
 | 
			
		||||
    parameter OUT_WIDTH = 640,
 | 
			
		||||
@@ -60,15 +60,15 @@ module crop #(
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                HANDLE_DATA: begin
 | 
			
		||||
                    if (OFFSET_Y <= cnt_y && cnt_y < (OFFSET_Y + OUT_HEIGHT)) begin
 | 
			
		||||
                        if (OFFSET_X <= cnt_x && cnt_x < (OFFSET_X + OUT_WIDTH)) begin
 | 
			
		||||
                    if (OFFSET_Y <= cnt_y && cnt_y < (OFFSET_Y + OUT_HEIGHT - 1)) begin
 | 
			
		||||
                        if (OFFSET_X <= cnt_x && cnt_x < (OFFSET_X + OUT_WIDTH - 1)) begin
 | 
			
		||||
                            out_en <= 1;
 | 
			
		||||
                        end
 | 
			
		||||
                    end
 | 
			
		||||
 | 
			
		||||
                    if (cnt_x >= IN_WIDTH) begin
 | 
			
		||||
                    if (cnt_x >= IN_WIDTH - 1) begin
 | 
			
		||||
                        cnt_x <= 0;
 | 
			
		||||
                        if (cnt_y >= IN_HEIGHT) begin
 | 
			
		||||
                        if (cnt_y >= IN_HEIGHT - 1) begin
 | 
			
		||||
                            cnt_y <= 0;
 | 
			
		||||
                        end
 | 
			
		||||
                        else begin
 | 
			
		||||
 
 | 
			
		||||
@@ -152,13 +152,14 @@ module demosaic2 #(
 | 
			
		||||
                        pos_y <= pos_y + 1;
 | 
			
		||||
                        if (pos_y >= IM_HEIGHT - 2 - 1) begin
 | 
			
		||||
                            pos_y <= 0;
 | 
			
		||||
                            case (RAW_TYPE)
 | 
			
		||||
                                0: raw_type <= 2;
 | 
			
		||||
                                1: raw_type <= 3;
 | 
			
		||||
                                2: raw_type <= 0;
 | 
			
		||||
                                3: raw_type <= 1;
 | 
			
		||||
                            endcase
 | 
			
		||||
                        end
 | 
			
		||||
                        // 换行后切换Bayer格式
 | 
			
		||||
                        case (RAW_TYPE)
 | 
			
		||||
                            0: raw_type <= 2;
 | 
			
		||||
                            1: raw_type <= 3;
 | 
			
		||||
                            2: raw_type <= 0;
 | 
			
		||||
                            3: raw_type <= 1;
 | 
			
		||||
                        endcase
 | 
			
		||||
                    end
 | 
			
		||||
                    else begin
 | 
			
		||||
                        cnt_data <= 2;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								isp.v
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								isp.v
									
									
									
									
									
								
							@@ -1,10 +1,10 @@
 | 
			
		||||
`timescale 1ns/1ps
 | 
			
		||||
 | 
			
		||||
module isp #(
 | 
			
		||||
    parameter IN_WIDTH = 700,
 | 
			
		||||
    parameter IN_HEIGHT = 500,
 | 
			
		||||
    parameter OUT_WIDTH = 640,
 | 
			
		||||
    parameter OUT_HEIGHT = 480,
 | 
			
		||||
    parameter IN_WIDTH = 1936,
 | 
			
		||||
    parameter IN_HEIGHT = 1088,
 | 
			
		||||
    parameter OUT_WIDTH = 1920,
 | 
			
		||||
    parameter OUT_HEIGHT = 1080,
 | 
			
		||||
    parameter COLOR_DEPTH = 8,
 | 
			
		||||
    parameter RAW_TYPE = 3          // 0:grbg 1:rggb 2:bggr 3:gbrg
 | 
			
		||||
) (
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ VERILATOR_FLAGS += --assert
 | 
			
		||||
TOP_MODULE = isp
 | 
			
		||||
VERILATOR_FLAGS += -top $(TOP_MODULE)
 | 
			
		||||
# Input files for Verilator
 | 
			
		||||
VERILATOR_INPUT = ../isp.v sc_main.cpp ../Demosaic/demosaic2.v ../Crop/*.v ../FIFO/*.v ../Merge/*.v ../RAM/*.v
 | 
			
		||||
VERILATOR_INPUT = ../isp.v *.cpp ../Demosaic/demosaic2.v ../Crop/*.v ../FIFO/*.v ../Merge/*.v ../RAM/*.v
 | 
			
		||||
 | 
			
		||||
# Check if SC exists via a verilator call (empty if not)
 | 
			
		||||
SYSTEMC_EXISTS := $(shell $(VERILATOR) --get-supported SYSTEMC)
 | 
			
		||||
@@ -88,9 +88,10 @@ run:
 | 
			
		||||
 | 
			
		||||
	@echo
 | 
			
		||||
	@echo "-- RUN ---------------------"
 | 
			
		||||
	@rm -rf logs
 | 
			
		||||
	@mkdir -p logs
 | 
			
		||||
	obj_dir/V$(TOP_MODULE) +trace
 | 
			
		||||
	# @rm -rf logs
 | 
			
		||||
	# @mkdir -p logs
 | 
			
		||||
	# obj_dir/V$(TOP_MODULE) +trace
 | 
			
		||||
	obj_dir/V$(TOP_MODULE)
 | 
			
		||||
 | 
			
		||||
	# @echo
 | 
			
		||||
	# @echo "-- COVERAGE ----------------"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								sim/bmp.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								sim/bmp.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#include "bmp.hpp"
 | 
			
		||||
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
// 将RGB24格式像素数据封装为BMP图像
 | 
			
		||||
bool write_bmp(const char* filename, uint8_t* data, int32_t width,
 | 
			
		||||
               int32_t height) {
 | 
			
		||||
    BMPFileHeader file_header = {0};
 | 
			
		||||
    BMPInfoHeader info_header = {0};
 | 
			
		||||
    std::ofstream ofs(filename, std::ios::binary);
 | 
			
		||||
    if (!ofs) {
 | 
			
		||||
        std::cerr << "Failed to create file: " << filename << std::endl;
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    // BMP文件头
 | 
			
		||||
    file_header.type = 0x4D42;  // BM
 | 
			
		||||
    file_header.size =
 | 
			
		||||
        sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + width * height * 3;
 | 
			
		||||
    file_header.offset = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader);
 | 
			
		||||
    ofs.write(reinterpret_cast<char*>(&file_header), sizeof(file_header));
 | 
			
		||||
 | 
			
		||||
    // BMP位图信息头
 | 
			
		||||
    info_header.size = sizeof(BMPInfoHeader);
 | 
			
		||||
    info_header.width = width;
 | 
			
		||||
    info_header.height = height;
 | 
			
		||||
    info_header.planes = 1;
 | 
			
		||||
    info_header.bit_count = 24;
 | 
			
		||||
    info_header.size_image = width * height * 3;
 | 
			
		||||
    ofs.write(reinterpret_cast<char*>(&info_header), sizeof(info_header));
 | 
			
		||||
 | 
			
		||||
    // 像素数据
 | 
			
		||||
    int32_t row_size = (((width + 1) * 3) / 4) * 4;  // 行字节数,必须为4的倍数
 | 
			
		||||
    uint8_t* row_data = new uint8_t[row_size];
 | 
			
		||||
    for (int32_t y = height - 1; y >= 0; --y) {  // BMP图像的行是从下往上存储的
 | 
			
		||||
        for (int32_t x = 0; x < width; ++x) {
 | 
			
		||||
            row_data[x * 3 + 2] = data[(y * width + x) * 3 + 0];  // B
 | 
			
		||||
            row_data[x * 3 + 1] = data[(y * width + x) * 3 + 1];  // G
 | 
			
		||||
            row_data[x * 3 + 0] = data[(y * width + x) * 3 + 2];  // R
 | 
			
		||||
        }
 | 
			
		||||
        ofs.write(reinterpret_cast<char*>(row_data), row_size);
 | 
			
		||||
    }
 | 
			
		||||
    delete[] row_data;
 | 
			
		||||
    ofs.close();
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								sim/bmp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								sim/bmp.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#ifndef __BMP_H__
 | 
			
		||||
#define __BMP_H__
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#pragma pack(push, 1) // 1字节对齐
 | 
			
		||||
 | 
			
		||||
// BMP文件头结构体
 | 
			
		||||
struct BMPFileHeader {
 | 
			
		||||
    uint16_t type; // 文件类型,必须为"BM"
 | 
			
		||||
    uint32_t size; // 文件大小,单位为字节
 | 
			
		||||
    uint16_t reserved1; // 保留字段,必须为0
 | 
			
		||||
    uint16_t reserved2; // 保留字段,必须为0
 | 
			
		||||
    uint32_t offset; // 像素数据起始位置,单位为字节
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// BMP位图信息头结构体
 | 
			
		||||
struct BMPInfoHeader {
 | 
			
		||||
    uint32_t size; // 信息头大小,必须为40
 | 
			
		||||
    int32_t width; // 图像宽度,单位为像素
 | 
			
		||||
    int32_t height; // 图像高度,单位为像素
 | 
			
		||||
    uint16_t planes; // 颜色平面数,必须为1
 | 
			
		||||
    uint16_t bit_count; // 每个像素的位数,必须为24
 | 
			
		||||
    uint32_t compression; // 压缩方式,必须为0
 | 
			
		||||
    uint32_t size_image; // 像素数据大小,单位为字节
 | 
			
		||||
    int32_t x_pels_per_meter; // X方向像素数/米
 | 
			
		||||
    int32_t y_pels_per_meter; // Y方向像素数/米
 | 
			
		||||
    uint32_t clr_used; // 使用的颜色数,必须为0
 | 
			
		||||
    uint32_t clr_important; // 重要的颜色数,必须为0
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#pragma pack(pop)
 | 
			
		||||
 | 
			
		||||
bool write_bmp(const char* filename, uint8_t* data, int32_t width, int32_t height);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -16,12 +16,13 @@
 | 
			
		||||
// Handle file
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include "bmp.hpp"
 | 
			
		||||
 | 
			
		||||
#define IN_WIDTH 700
 | 
			
		||||
#define IN_HEIGHT 500
 | 
			
		||||
#define IN_WIDTH 1936
 | 
			
		||||
#define IN_HEIGHT 1088
 | 
			
		||||
#define IN_SIZE (IN_WIDTH * IN_HEIGHT)
 | 
			
		||||
#define OUT_WIDTH 640
 | 
			
		||||
#define OUT_HEIGHT 480
 | 
			
		||||
#define OUT_WIDTH 1920
 | 
			
		||||
#define OUT_HEIGHT 1080
 | 
			
		||||
#define OUT_SIZE (OUT_WIDTH * OUT_HEIGHT)
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
@@ -41,7 +42,7 @@ SC_MODULE (TB_ISP) {
 | 
			
		||||
    sc_in<uint32_t> im_data;
 | 
			
		||||
 | 
			
		||||
    sc_out<bool> is_done;
 | 
			
		||||
    unique_ptr<uint16_t[]> image;
 | 
			
		||||
    unique_ptr<uint16_t[]> image = make_unique<uint16_t[]>(IN_SIZE);
 | 
			
		||||
    unique_ptr<uint32_t[]> out = make_unique<uint32_t[]>(OUT_SIZE);
 | 
			
		||||
 | 
			
		||||
    SC_CTOR (TB_ISP) {
 | 
			
		||||
@@ -69,7 +70,7 @@ SC_MODULE (TB_ISP) {
 | 
			
		||||
                wait(1);
 | 
			
		||||
                data_en.write(0);
 | 
			
		||||
 | 
			
		||||
                if (pos_x++ >= IN_WIDTH) {
 | 
			
		||||
                if (++pos_x >= IN_WIDTH) {
 | 
			
		||||
                    pos_x = 0;
 | 
			
		||||
                    pos_y++;
 | 
			
		||||
                }
 | 
			
		||||
@@ -100,7 +101,7 @@ SC_MODULE (TB_ISP) {
 | 
			
		||||
 | 
			
		||||
            if (last_data == im_data.read()) {
 | 
			
		||||
                cnt++;
 | 
			
		||||
                if (cnt >= 100) {
 | 
			
		||||
                if (cnt >= 10000) {
 | 
			
		||||
                    is_done.write(1);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
@@ -129,7 +130,6 @@ int sc_main(int argc, char* argv[]) {
 | 
			
		||||
 | 
			
		||||
    // Read image
 | 
			
		||||
    auto buf = make_unique<uint8_t[]>(2 * IN_SIZE);
 | 
			
		||||
    // vector<vector<uint8_t>> buf(IN_HEIGHT, vector<uint8_t>(IN_WIDTH, 0));
 | 
			
		||||
    in_image.read((char*)buf.get(), IN_SIZE * 2);
 | 
			
		||||
    in_image.close();
 | 
			
		||||
    // Reshape data
 | 
			
		||||
@@ -259,10 +259,35 @@ int sc_main(int argc, char* argv[]) {
 | 
			
		||||
 | 
			
		||||
    // Save output image
 | 
			
		||||
    cout << "Ready to save raw RGB image" << endl;
 | 
			
		||||
    for (int y = 0; y < OUT_HEIGHT; y++)
 | 
			
		||||
        for(int x = 0; x < OUT_WIDTH; x++)
 | 
			
		||||
            out_image.write((const char *)&tb_isp.out[y * OUT_WIDTH + x], sizeof(tb_isp.out[0]));
 | 
			
		||||
    out_image.close();
 | 
			
		||||
    // for (int y = 0; y < OUT_HEIGHT; y++)
 | 
			
		||||
    //     for(int x = 0; x < OUT_WIDTH; x++)
 | 
			
		||||
    //         out_image.write((const char *)&tb_isp.out[y * OUT_WIDTH + x], sizeof(tb_isp.out[0]));
 | 
			
		||||
    // out_image.close();
 | 
			
		||||
 | 
			
		||||
    // save to image
 | 
			
		||||
    uint8_t* data = new uint8_t[OUT_WIDTH * OUT_HEIGHT * 3]; // RGB24格式像素数据
 | 
			
		||||
    for (int32_t y = 0; y < OUT_HEIGHT; ++y) {
 | 
			
		||||
        for (int32_t x = 0; x < OUT_WIDTH; ++x) {
 | 
			
		||||
            int32_t index = (y * OUT_WIDTH + x) * 3;
 | 
			
		||||
 | 
			
		||||
            uint8_t red = ( tb_isp.out[y * OUT_WIDTH + x] & 0x00ff0000 ) >> 16;
 | 
			
		||||
            uint8_t green = ( tb_isp.out[y * OUT_WIDTH + x] & 0x0000ff00 ) >> 8;
 | 
			
		||||
            uint8_t blue = ( tb_isp.out[y * OUT_WIDTH + x] & 0x000000ff );
 | 
			
		||||
 | 
			
		||||
            out_image.write((const char *)&red, sizeof(red));
 | 
			
		||||
            out_image.write((const char *)&green, sizeof(green));
 | 
			
		||||
            out_image.write((const char *)&blue, sizeof(blue));
 | 
			
		||||
 | 
			
		||||
            printf("x=%4d, y=%4d, red=0x%02x, green=0x%02x, blue=0x%02x\n", x, y, red, green, blue);
 | 
			
		||||
 | 
			
		||||
            data[index + 0] = red; // R
 | 
			
		||||
            data[index + 1] = green; // G
 | 
			
		||||
            data[index + 2] = blue; // B
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    write_bmp("test.bmp", data, OUT_WIDTH, OUT_HEIGHT);
 | 
			
		||||
    delete[] data;
 | 
			
		||||
 | 
			
		||||
    // Return good completion status
 | 
			
		||||
    return 0;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										126
									
								
								sim/software/demosaic.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								sim/software/demosaic.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "bmp.hpp"
 | 
			
		||||
 | 
			
		||||
const int IN_WIDTH = 1920;
 | 
			
		||||
const int IN_HEIGHT = 1080;
 | 
			
		||||
const int IN_SIZE = IN_WIDTH * IN_HEIGHT;
 | 
			
		||||
const int OUT_WIDTH = 1280;
 | 
			
		||||
const int OUT_HEIGHT = 720;
 | 
			
		||||
const int OUT_SIZE = OUT_WIDTH * OUT_HEIGHT;
 | 
			
		||||
const int RAW_TYPE = 3;
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    std::ifstream in_image;
 | 
			
		||||
    in_image.open("./test.RAW", std::ios::in | std::ios::binary);
 | 
			
		||||
    auto image = std::vector<std::vector<uint16_t>>(
 | 
			
		||||
        IN_HEIGHT, std::vector<uint16_t>(IN_WIDTH, 0));
 | 
			
		||||
    for (int y = 0; y < IN_HEIGHT; y++)
 | 
			
		||||
        for (int x = 0; x < IN_WIDTH; x++) {
 | 
			
		||||
            uint8_t buf[2] = {0};
 | 
			
		||||
            in_image.read((char*)buf, sizeof(buf));
 | 
			
		||||
 | 
			
		||||
            image[y][x] = buf[0] + (buf[1] << 8);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    int raw_type = RAW_TYPE;
 | 
			
		||||
    uint8_t* data =
 | 
			
		||||
        new uint8_t[OUT_WIDTH * OUT_HEIGHT * 3];  // RGB24格式像素数据
 | 
			
		||||
    for (int32_t y = 0; y < OUT_HEIGHT; ++y) {
 | 
			
		||||
        for (int32_t x = 0; x < OUT_WIDTH; ++x) {
 | 
			
		||||
            int32_t index = (y * OUT_WIDTH + x) * 3;
 | 
			
		||||
 | 
			
		||||
            uint16_t red = 0, green = 0, blue = 0;
 | 
			
		||||
            uint16_t data_cache[3][3] = {
 | 
			
		||||
                {image[y][x], image[y][x + 1], image[y][x + 2]},
 | 
			
		||||
                {image[y + 1][x], image[y + 1][x + 1], image[y + 1][x + 2]},
 | 
			
		||||
                {image[y + 2][x], image[y + 2][x + 1], image[y + 2][x + 2]},
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            switch (raw_type) {
 | 
			
		||||
                case 0:  // Missing B, R on G
 | 
			
		||||
                    blue = (data_cache[1][0] + data_cache[1][2]) / 2;
 | 
			
		||||
                    red = (data_cache[0][1] + data_cache[2][1]) / 2;
 | 
			
		||||
                    green = data_cache[1][1];
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 1:  // Missing G, R on B
 | 
			
		||||
                    green = (data_cache[0][1] + data_cache[1][0] +
 | 
			
		||||
                             data_cache[1][2] + data_cache[2][1]) /
 | 
			
		||||
                            4;
 | 
			
		||||
                    red = (data_cache[0][0] + data_cache[0][2] +
 | 
			
		||||
                           data_cache[2][0] + data_cache[2][2]) /
 | 
			
		||||
                          4;
 | 
			
		||||
                    blue = data_cache[1][1];
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 2:  // Missing G, B on R
 | 
			
		||||
                    green = (data_cache[0][1] + data_cache[1][0] +
 | 
			
		||||
                             data_cache[1][2] + data_cache[2][1]) /
 | 
			
		||||
                            4;
 | 
			
		||||
                    blue = (data_cache[0][0] + data_cache[0][2] +
 | 
			
		||||
                            data_cache[2][0] + data_cache[2][2]) /
 | 
			
		||||
                           4;
 | 
			
		||||
                    red = data_cache[1][1];
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 3:  // Missing B, R on G
 | 
			
		||||
                    red = (data_cache[1][0] + data_cache[1][2]) / 2;
 | 
			
		||||
                    blue = (data_cache[0][1] + data_cache[2][1]) / 2;
 | 
			
		||||
                    green = data_cache[1][1];
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            printf("x=%4d, y=%4d, red=0x%03x, green=0x%03x, blue=0x%03x, raw_type=%d\n", x,
 | 
			
		||||
                   y, red, green, blue, raw_type);
 | 
			
		||||
 | 
			
		||||
            switch (raw_type) {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    raw_type = 1;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 1:
 | 
			
		||||
                    raw_type = 0;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 2:
 | 
			
		||||
                    raw_type = 3;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 3:
 | 
			
		||||
                    raw_type = 2;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // data[index + 0] = red * 8 / 12;    // R
 | 
			
		||||
            data[index + 1] = green * 8 / 12;  // G
 | 
			
		||||
            // data[index + 2] = blue * 8 / 12;   // B
 | 
			
		||||
            data[index + 0] = 0;    // R
 | 
			
		||||
            // data[index + 1] = 0;  // G
 | 
			
		||||
            data[index + 2] = 0;   // B
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (y % 2) {
 | 
			
		||||
            raw_type = RAW_TYPE;
 | 
			
		||||
        } else {
 | 
			
		||||
            switch (RAW_TYPE) {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    raw_type = 2;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 1:
 | 
			
		||||
                    raw_type = 3;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 2:
 | 
			
		||||
                    raw_type = 0;
 | 
			
		||||
                    break;
 | 
			
		||||
                case 3:
 | 
			
		||||
                    raw_type = 1;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    write_bmp("test.bmp", data, OUT_WIDTH, OUT_HEIGHT);
 | 
			
		||||
    delete[] data;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								sim/software/test.RAW
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sim/software/test.RAW
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
import imageio
 | 
			
		||||
import numpy as np
 | 
			
		||||
 | 
			
		||||
cut_width = 700
 | 
			
		||||
cut_height = 500
 | 
			
		||||
cut_width = 1936
 | 
			
		||||
cut_height = 1088
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    # txt = open('./test.dat', 'w')
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
import imageio
 | 
			
		||||
import numpy as np
 | 
			
		||||
 | 
			
		||||
im_width = 640
 | 
			
		||||
im_height = 480
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
	raw = np.fromfile('./out.bin', dtype=np.int32)
 | 
			
		||||
	image = raw.reshape((im_height, im_width))
 | 
			
		||||
	imageio.imsave("./out.png", image)
 | 
			
		||||
		Reference in New Issue
	
	Block a user