ヅ蕶碎の記憶919 2022-05-14 20:51 采纳率: 80%
浏览 39

求解这是啥原因啊,如果可以求一个可以运行的图像二值化代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#pragma pack(1)

#define R 30
#define G 59
#define B 11

#define ONE 255
#define ZERO 0

typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned char BYTE;

typedef struct tagBITMAPFILEHEADER
{ // bmfh
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
}
BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;

typedef struct tagPOINT{
BYTE b;
BYTE g;
BYTE r;
} POINT;

int quit();

int quit()
{
puts("File's format wrong");
exit(0);
}

void main (int argc,char *argv[])
{
FILE *fi,*fo;//I/O file
char fin[80],fon[80];//I/O file name
BYTE buff,o=0;
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
POINT **p;
int i,j,t;
if(argc<3)
{
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon);
}else{
sscanf(argv[1],"%s",fin);
sscanf(argv[2],"%s",fon);
}
if(argc==4)
sscanf(argv[4],"%d",&t);
else{
printf("theshold [0,255]:");
scanf("%d",&t);
}

if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL))
{
puts("\nfile open failed");
return;
}

fread(&bf,sizeof(bf),1,fi);
fread(&bi,sizeof(bi),1,fi);

if(bf.bfType!=0x4d42) quit();
if(bf.bfReserved1!=0x0000) quit();
if(bf.bfReserved2!=0x0000) quit();

if(bi.biClrImportant!=0) quit();
if(bi.biBitCount!=0x18) quit();
if(bi.biCompression!=0) quit();
if(bi.biPlanes!=1) quit();

bf.bfSize=54+1024+bi.biWidth*bi.biHeight;
bf.bfOffBits=54+1024;

if(bi.biWidth%4==0)
bi.biSizeImage=bi.biWidthbi.biHeightbi.biBitCount/8;
else
bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)bi.biHeightbi.biBitCount/8;
bi.biBitCount=8;

p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);
for (i=0;i<bi.biHeight;i++)
*(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);
//分配失败后果自负!

fwrite(&bf,sizeof(bf),1,fo);
fwrite(&bi,sizeof(bi),1,fo);

for (i=0;i<bi.biHeight;i++)
for (j=0;j<bi.biWidth;j++)
fread(*(p+i)+j,sizeof(POINT),1,fi);

for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)
{
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&o,sizeof(o),1,fo);
}

for (i=0;i<bi.biHeight;i++)
for (j=0;j<bi.biWidth;j++)
{
buff=(((p+i)+j)->rR+((p+i)+j)->gG+((p+i)+j)->bB)/100;
buff=(buff>=t?ONE:ZERO);
fwrite(&buff,sizeof(buff),1,fo);
}
fclose(fo);
}

img


为啥会一直显示打开失败

  • 写回答

1条回答 默认 最新

  • 雨下,听风 2023-01-02 10:03
    关注
    #include <stdio.h> 
    #include <stdlib.h>
    #include <conio.h>
    
    #pragma pack(1)
    
    #define R 30
    #define G 59
    #define B 11
    
    #define ONE 255 
    #define ZERO 0 
    
    typedef unsigned short WORD;
    typedef unsigned long DWORD;
    typedef long LONG;
    typedef unsigned char BYTE;
    
    typedef struct tagBITMAPFILEHEADER { // bmfh 
     WORD bfType; // 位图文件的类型,必须为BM
     DWORD bfSize; // 位图文件的大小,以字节为单位
     WORD bfReserved1; // 位图文件保留字,必须为0
     WORD bfReserved2; // 位图文件保留字,必须为0
     DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
    } BITMAPFILEHEADER; 
    
    typedef struct tagBITMAPINFOHEADER{ // bmih 
     DWORD biSize; // 本结构所占用字节数
     LONG biWidth; // 位图的宽度,以像素为单位
     LONG biHeight; // 位图的高度,以像素为单位
     WORD biPlanes; // 目标设备的级别,必须为1
     WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
     DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
     DWORD biSizeImage; // 位图的大小,以字节为单位
     LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
     LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
     DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
     DWORD biClrImportant;// 位图显示过程中重要的颜色数
    } BITMAPINFOHEADER; 
    
    typedef struct tagPOINT{
     BYTE b;
     BYTE g;
     BYTE r;
    } POINT;
    
    int quit();
    
    int quit()
    {
     puts("File's format wrong");
     exit(0);
    }
    
    void main (int argc,char *argv[]) 
    { 
     FILE *fi,*fo;//I/O file 
     char fin[80],fon[80];//I/O file name 
     BYTE buff,o=0;
     BITMAPFILEHEADER bf;
     BITMAPINFOHEADER bi;
     POINT **p;
     int i,j,t; 
     if(argc<3) 
     { 
      printf("orginfile name:"); 
      scanf("%s",fin); 
      printf("resultfile name:"); 
      scanf("%s",fon); 
     }else{ 
      sscanf(argv[1],"%s",fin); 
      sscanf(argv[2],"%s",fon); 
     } 
     if(argc==4) 
      sscanf(argv[4],"%d",&t); 
     else{ 
      printf("theshold [0,255]:"); 
      scanf("%d",&t); 
     } 
    
     if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL)) 
     { 
      puts("\nfile open failed"); 
      return; 
     } 
    
     fread(&bf,sizeof(bf),1,fi);
     fread(&bi,sizeof(bi),1,fi);
    
     if(bf.bfType!=0x4d42) quit();
     if(bf.bfReserved1!=0x0000) quit();
     if(bf.bfReserved2!=0x0000) quit();
    
     if(bi.biClrImportant!=0) quit();
     if(bi.biBitCount!=0x18) quit();
     if(bi.biCompression!=0) quit();
     if(bi.biPlanes!=1) quit();
    
     bf.bfSize=54+1024+bi.biWidth*bi.biHeight;
     bf.bfOffBits=54+1024;
     
     if(bi.biWidth%4==0)
      bi.biSizeImage=bi.biWidth*bi.biHeight*bi.biBitCount/8;
     else
      bi.biSizeImage=(bi.biWidth-(bi.biWidth%4)+4)*bi.biHeight*bi.biBitCount/8;
     bi.biBitCount=8;
    
     p=(POINT **)malloc(sizeof(POINT *)*bi.biHeight);
     for (i=0;i<bi.biHeight;i++)
     *(p+i)=(POINT *)malloc(sizeof(POINT)*bi.biWidth);
     //分配失败后果自负!
    
     fwrite(&bf,sizeof(bf),1,fo);
     fwrite(&bi,sizeof(bi),1,fo);
    
     for (i=0;i<bi.biHeight;i++) 
      for (j=0;j<bi.biWidth;j++)
       fread(*(p+i)+j,sizeof(POINT),1,fi);
    
     for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)
     {
      fwrite(&buff,sizeof(buff),1,fo);
      fwrite(&buff,sizeof(buff),1,fo);
      fwrite(&buff,sizeof(buff),1,fo);
      fwrite(&o,sizeof(o),1,fo);
     }
    
     for (i=0;i<bi.biHeight;i++) 
      for (j=0;j<bi.biWidth;j++) 
      {
       buff=((*(p+i)+j)->r*R+(*(p+i)+j)->g*G+(*(p+i)+j)->b*B)/100;
       buff=(buff>=t?ONE:ZERO)
       fwrite(&buff,sizeof(buff),1,fo);
      }
     fclose(fo); 
    } 
    

    来源:https://blog.csdn.net/xuexiiphone/article/details/51252764

    评论

报告相同问题?

问题事件

  • 创建了问题 5月14日

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。