2013-03-20 17 views
11

Opencv kullanıyorum ve başka bir resmin bir kısmından resim oluşturmak istiyorum.openCV C++ ile görüntünün bir bölümünü kopyalayın

Bunu yapan bir işlev bulamadım. Bu nedenle, görüntü pikselini piksele kopyalamayı içeren, ancak boş bıraktığım sonucu almadığım için Fikirlerimi uygulamaya çalışıyorum.

herhangi biri başka bir fikir

Kodu vardır:

#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; 
} 

cevap

8

o görüntünün üzerinde YG (Region of Interest) ayarlanmasıyla ve yeni bir görüntüye ROI tarafından tanımlanan o kısmı kopyalayarak yapılabilir.

demo using IplImage on this post'u görebilirsiniz.

Bu sizin kod kullandığını unutmamak gerekir:

Bu yayınlar ROI kullanımları farklı senaryolar çözmek göstermek C OpenCV arabirimi. C++ arabirimi, IplImage eşdeğeri olan cv::Mat sunar. Başka bir deyişle, aradığınız şey sorun için bir C çözümü.

0

cvSetImageROI() fonksiyonunu arayın.

Belirli bir dikdörtgenin resmini İlgi Alanı (ROI) belirler.

23

cv::Mat adlı kullanıcının kopya yapıcısını kullanmalısınız. Bu IplImage çok daha iyi: Eğer başarmak için çalışıyoruz ne

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

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

durum farklıdır; Eski OpenCV 'yeni' C++ api karşı. Aslında, eski IplImage öğeleri OpenCV 3'te amortismana uğrayacak ve bunu okuyan herkese yeni cv :: Mat stiline geçmesini tavsiye ediyorum. – TimZaman

2

kullanma kopya yapıcısı: Bu tanım gereği daha iyi değil

cv::Mat whole = ...; // from imread or anything else 
cv::Mat part(
    whole, 
    cv::Range(20, 220), // rows 
    cv::Range(10, 210));// cols 
İlgili konular