2012-03-09 85 views
5

Tôi đang triển khai thuật toán xử lý hình ảnh trong C++ bằng cách sử dụng openCV, trong đó bước đầu tiên yêu cầu hình ảnh được chuyển đổi thành ma trận. Tôi biết rằng khi một hình ảnh được tải vào openCV, nó đã được lưu trữ như một ma trận. Hình ảnh mà tôi đang sử dụng có kích thước 80 x 60, vì vậy tôi giả sử rằng ma trận được lưu trữ có kích thước 80 x 60. Tuy nhiên, tôi muốn lần đầu tiên có thể xem ma trận này và sau đó có thể định lại hình ảnh nó thành một ma trận với cùng một không. của pixel nhưng thay vì một cột dài thay thế. tức là ma trận 80 x 60 giờ sẽ trở thành ma trận 4800 x 1. Tôi đã thử nghiên cứu sách giáo khoa và trực tuyến nhưng không có kết quả. Đây là mã của tôi cho đến nay. Trong mọi trường hợp, nó không hoạt động bởi vì tôi không thể chuyển đổi từ 'IplImage *' thành 'CvMat * nhưng làm cách nào khác tôi phải gán giá trị pixel của mình cho ma trận sau khi tạo nó? Xin vui lòng, tôi sẽ đánh giá rất cao nếu ai đó có thể giúp tôi với mã này.Cách lấy ma trận điểm ảnh và ma trận định hình lại trong openCV

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 

using namespace std; 
int main(int argc, char* argv) { 
IplImage* img0 = NULL; 
CvMat* img0_mat = NULL ; 
img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
if (!img0){ 
    return -1;} 
img0_mat = cvCreateMat(80, 60, 1); 
img0_mat = img0; 
cout <<" matrix " << img0 << endl; 

cvWaitKey(0); 
return 0; 
} 
+0

Giống như thông tin: opencv không lưu trữ hình ảnh trong ma trận theo nghĩa 'int [] []'. Bên trong nó chỉ sử dụng một chiều duy nhất, như 'char []'. – vsz

Trả lời

1

Bạn có thể gọi Mat::reshape(int cn, int rows=0):

Phương pháp này tạo ra một tiêu đề ma trận mới cho * các yếu tố này. Ma trận mới có thể có kích thước khác nhau và/hoặc số kênh khác nhau. Bất kỳ kết hợp nào cũng có thể, miễn là:

1) Không có yếu tố bổ sung nào được đưa vào ma trận mới và không có yếu tố nào bị loại trừ. Do đó, sản phẩm

2) hàng * cols * kênh() phải giữ nguyên sau khi chuyển đổi.

Không sao chép dữ liệu, tức là đây là hoạt động O (1). Do đó, nếu bạn thay đổi số hàng hoặc hoạt động thay đổi chỉ mục hàng của các phần tử theo cách khác, ma trận phải liên tục. Xem Mat :: isContinuous().

... có vẻ như bạn đang sử dụng phiên bản cũ của thư viện mặc dù vậy bạn muốn cvReshape. Một cái gì đó như thế này sẽ hoạt động:

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 
using namespace std; 

int main(int argc, char* argv) 
{ 
    IplImage* img0 = NULL; 
    CvMat* img0_mat = NULL ; 
    img0 = cvLoadImage("C:\\new\\walk mii.jpg"); 
    img0_mat = cvCreateMat(80, 60, 1); 

    CvMat row_header, *row; 
    row = cvReshape(img0_mat, &row_header, 0, 1); 

    cout << " matrix " << row->tostring() << endl; 

    cvWaitKey(0); 
    return 0; 
} 
+0

Điều này cũng có thể quan tâm: http://stackoverflow.com/questions/7125452/how-am-i-supposed-to-use-cvreshape –

+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ Mr. Cage. Mã của bạn đã hoạt động. Tuy nhiên, đầu ra là ma trận 0032FC38. Tôi hy vọng tôi không hỏi một câu hỏi ngớ ngẩn, nhưng tôi đã thất vọng như vậy có thể là tốt. Không phải số hàng được cho là 4800? Ngoài ra, làm thế nào để tôi nhận được các giá trị pixel của hình ảnh img0 của tôi vào ma trận img0_mat được tạo ra? –

+0

0032FC38 sẽ là địa chỉ con trỏ của hàng thay vì nội dung. Nếu bạn đọc tài liệu cvReshape, nó sẽ cho bạn biết rằng nó không gán thêm dung lượng lưu trữ; nó chỉ cung cấp một cách mới để truy cập dữ liệu. –