में एक छवि फ़ाइल पढ़ना मैं सी ++ पर एक पूर्ण नोबी हूं क्योंकि मैं केवल जावा प्रोग्रामिंग से परिचित हूं। मैं जो करने की कोशिश कर रहा हूं वह एक मैट्रिक्स में एक छवि फ़ाइल (.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])));
}