2013-03-20 41 views
11

Tôi đang sử dụng opencv và tôi muốn tạo hình ảnh từ một phần của hình ảnh khác.sao chép một phần của hình ảnh bằng openCv C++

Tôi không tìm thấy chức năng làm điều đó vì vậy tôi cố gắng triển khai ý tưởng của mình, bao gồm sao chép điểm ảnh theo pixel nhưng vô ích tôi không nhận được kết quả mà tôi đang đợi.

Bất kỳ ai có ý tưởng khác

Code:

#include "cv.h" 
#include "highgui.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 

int main(int argc,char** argv) { 
    IplImage * img =0; 

    uchar *data; 
    int i,j,k; 
    int height,width,widthStep,nChannels; 
    img=cvLoadImage(argv[1],3); 
    height =img->height; 
    width = img->width; 
    widthStep= img->widthStep; 
    nChannels = img->nChannels; 
    data=(uchar*)img->imageData; 
    IplImage* img1=cvCreateImage(cvSize(height/2,width/2),IPL_DEPTH_8U,nChannels); 
    for(i=0;i<height/2;i++){ 
    for(j=0;j<width/2;j++){ 
     for(k=0;k<3;k++){ 
     img1->imageData[i*widthStep+j*nChannels]=data[i*widthStep+j*nChannels]; 
     } 
    } 
    } 
    cvShowImage("image_Originale2",img1); 
    cvWaitKey(0); 
    cvReleaseImage(&img); 
    return 0; 
} 

Trả lời

8

gì bạn đang cố gắng để hoàn thành có thể được thực hiện bằng cách thiết lập một ROI (Vùng yêu thích) trên hình ảnh đó và sao chép mà phần định nghĩa bởi ROI để một hình ảnh mới.

Bạn có thể thấy demo using IplImage on this post.

Những bài viết hiển thị sử dụng của ROI để giải quyết các tình huống khác nhau:

Điều quan trọng cần lưu ý là mã của bạn đang sử dụng C giao diện của OpenCV. Giao diện C++ cung cấp cv::Mat, tương đương với IplImage. Nói cách khác, những gì bạn đang tìm kiếm là một giải pháp C cho sự cố.

0

Tra cứu cvSetImageROI() chức năng.

Đặt hình ảnh Vùng quan tâm (ROI) cho hình chữ nhật đã cho.

23

Bạn nên sử dụng hàm tạo bản sao của cv::Mat. Sẽ tốt hơn nhiều so với IplImage:

int x = 10, 
    y = 20, 
    width = 200, 
    height = 200; 

Mat img1, img2; 
img1 = imread("Lenna.png"); 
img2 = img1(Rect(x, y, width, height)); 
+2

Nó không phải tốt hơn theo định nghĩa, đó là khác nhau; OpenCV cũ so với api C++ 'mới'. Thật vậy, nhưng công cụ IplImage cũ sẽ được khấu hao trong OpenCV 3, và tôi khuyên mọi người đọc nó để chuyển sang cv mới :: Kiểu Mat. – TimZaman

2

Sử dụng bản sao constructor:

cv::Mat whole = ...; // from imread or anything else 
cv::Mat part(
    whole, 
    cv::Range(20, 220), // rows 
    cv::Range(10, 210));// cols 
Các vấn đề liên quan