2012-12-06 19 views
11

में एक छवि फ़ाइल पढ़ना मैं सी ++ पर एक पूर्ण नोबी हूं क्योंकि मैं केवल जावा प्रोग्रामिंग से परिचित हूं। मैं जो करने की कोशिश कर रहा हूं वह एक मैट्रिक्स में एक छवि फ़ाइल (.bmp) को पढ़ना है जहां मैं मैट्रिक्स पर 3x3 मैट्रिक्स (फ़िल्टर) के साथ एक रूपांतरण कर सकता हूं ताकि संकलित छवि के साथ एक नई छवि फ़ाइल तैयार की जा सके।सी ++ छवि प्रसंस्करण - 2 डी ऐरे

मैं गूगल के आसपास देखा है और निम्नलिखित कार्यान्वयन के साथ आने में कामयाब रहे:

Image.h फ़ाइल:

// Image.h 

#include <fstream> // for file I/O 

using namespace std; 
typedef unsigned char unchar; // Easier to understand & code. 

class MImage { 

public: 
    MImage(const char* fileName); //Constructor 
    ~MImage(); //Deconstructor 
    void write(const char* fileName); 
    void smoothFilter(); //smoothing filer. 
private: 
    ifstream* pInFile; 
    ofstream* pOutFile; 
    unchar imageHeaderData[1078]; //.bmp header data with offset 1078. 
    unchar** imageData; 
    unchar m_smoothFilter[3][3]; // Smoothing Filter. 
    unchar** filteredData; 
}; 

Image.cpp फ़ाइल:

// Image.cpp 
// 

#ifndef _Image_h 
#define _Image_h 
#define WIDTH 128 
#define HEIGHT 128 

#include "Image.h" 
#include <cmath> 

#endif 

using namespace std; 
typedef unsigned char unchar; 

//Constructor 

MImage::MImage(const char* fileName){ 

    imageData = new unchar* [HEIGHT]; // create new array size: height of image. 
    filteredData = new unchar* [HEIGHT];// create new array size: height of image. 

    for (int i = 0; i < HEIGHT; i++) { 

     imageData[i] = new unchar [WIDTH]; //create matrix. 
     filteredData[i] = new unchar [WIDTH]; //create matrix. 
    } 

    //image I/O 
    pInFile = new ifstream; 
    pInFile->open(fileName, ios::in | ios::binary); // open fileName and read as binary. 
    pInFile->seekg(0, ios::beg); //pos filter at beginning of image file. 
    pInFile->read(reinterpret_cast<char*>(imageHeaderData),1078); //read bmp header data into array. 

    for(int i=0; i<HEIGHT; i++) { 
     pInFile->read(reinterpret_cast<char*>(imageData[i]),WIDTH);//read row into each array entry. 
    } 

    pInFile->close(); //close stream. 

    char m_smoothFilter[3][3] = { 
           {1,1,1}, 
           {1,2,1}, 
           {1,1,1} 
           }; 

} 

MImage::~MImage(){ 

    delete pInFile; 
    delete pOutFile; 

    for(int i=0; i<HEIGHT; i++){ 
     delete[] imageData[i]; 
     delete[] filteredData[i]; 
    } 

    delete[] imageData; 
    delete[] filteredData; 
} 

void MImage::write(const char* fileName) { 

    smoothFilter(); 
    pOutFile = new ofstream; 
    pOutFile->open(fileName, ios::out | ios::trunc | ios::binary); 
    pOutFile->write(reinterpret_cast<char*>(imageHeaderData), 1078); //write header data onto output 

    for(int i = 0; i < HEIGHT; i++){ 

     pOutFile->write(reinterpret_cast<char*>(filteredData[i]),WIDTH); // write new image data. 

    } 

    pOutFile->close(); //close stream 
} 

void MImage::smoothFilter(){ 

    //copy input image into new image 
    for(int i = 0; i < HEIGHT; i++) { 
     strcpy(reinterpret_cast<char*>(filteredData[i]), reinterpret_cast<char*>(imageData[i])); 
    } 

    int sumOfPixels = 0; 

    for(int i = 1; i < HEIGHT -1; i++) { 

     for(int j = 1; j < WIDTH -1; j++) { 

      sumOfPixels = m_smoothFilter[0][0] * imageData[i+1][j-1] + // top left corner 
          m_smoothFilter[0][1] * imageData[i+1][j] + // top center 
          m_smoothFilter[0][2] * imageData[i+1][j+1] + // top right corner 
          m_smoothFilter[1][0] * imageData[i][j-1] + // center left 
          m_smoothFilter[1][1] * imageData[i][j]  + // center center 
          m_smoothFilter[1][2] * imageData[i][j+1] + // center right 
          m_smoothFilter[2][0] * imageData[i-1][j-1] + // bottom left corner 
          m_smoothFilter[2][1] * imageData[i-1][j] + // bottom center 
          m_smoothFilter[2][2] * imageData[i-1][j+1]; // bottom right corner 

      filteredData[i][j] = (sumOfPixels/(m_smoothFilter[0][0] + m_smoothFilter[0][1] + 
                m_smoothFilter[0][2] + m_smoothFilter[1][0] + 
                m_smoothFilter[1][1] + m_smoothFilter[1][2] + 
                m_smoothFilter[2][0] + m_smoothFilter[2][1] + 
               m_smoothFilter[2][2])); 
     } 
    } 

} 

मुख्य। सीपीपी फ़ाइल:

// 
// Main.cpp 
// 

#include <iostream> 
#include "Image.cpp" 
#include <fstream> 

using namespace std; 

int main() { 

    MImage img("test.bmp"); 
    img.write("output.bmp"); 
    return 0; 

} 

जब मैं के साथ निम्न फ़ाइल चलाने का प्रयास:

g++ Main.cpp -o main 

./main 

मैं एक विभाजन मिलती है: 11 त्रुटि और यकीन नहीं क्या इस त्रुटि उत्पन्न कर रहा है!

नोट: मुझे शुद्ध सी ++ कार्यान्वयन का उपयोग करना है ताकि अन्य पुस्तकालयों का उपयोग न हो।

सहायता!

संपादित करें:

for(int i = 0; i < HEIGHT; i++) { 
     strcpy(reinterpret_cast<char*>(filteredData[i]), reinterpret_cast<char*>(imageData[i])); 
} 

लेकिन यकीन नहीं क्यों: मैं कोड thats मुझे विभाजन त्रुटि दे रहा है लगता है! साथ कोड ऊपर बदलने के बाद काम करता है::

संपादित # 3

for(int i= 0; i<HEIGHT; i++) { 
     strncpy (reinterpret_cast<char*>(filteredData[i]), 
       reinterpret_cast<char*>(imageData[i]), 
       sizeof(reinterpret_cast<char*>(filteredData[i]))); 
    } 

उत्तर

5

strncpy() साथ strcpy() प्रतिस्थापित जो जाहिरा तौर पर ज्यादा सुरक्षित है और वह विभाजन गलती से हटा दिया।

2

मुख्य समारोह में आप "छवि.cpp" शामिल करते हैं और "छवि.h" होना चाहिए अन्यथा संकलक पहले से ही हेडर फ़ाइल

में परिभाषित कार्यों की एक और परिभाषा को पहचान लेगा
संबंधित मुद्दे