2017년 8월 13일 일요일

opencv createTrackbar 응용_1 X축 휘도분포 보기

3,4 모르겠음..아시면 누가 답변좀

1.src.copyTo(dst)
2.profile.setTo(255)  //Mat profile;
3. uchar* pSrc   *pSrc는 포인터 변수이고 주소가 나타내는 값을 uchar로 저장한다는 의미?
4.src.ptr이 포인터형 주소값을 나타내는 상황에서 이 포인터가 나타내는 값을 uchar로 받겠다는 의미? (uchar*)src.ptr
->명시적 형변환

5. <uchar>(row)< row값을 uchar 형으로 형변환하여 받는다는 의미?

->Mat 자료형에서 ptr이 const로 되어있는 상황에서  <>(const_cast) 를 해줌으로써 상수형을 비상수형으로 바꾼다음 넣어줄수 있다.
실제로 (uchar)(row)하면 error 발생











5번 참고자료
-------------------------------------------------------
const_cast

const_cast 는 상수 포인터에서 const (변수의 상수화) 속성이나 volatile(변수에 대해 컴파일러가 최적화를 못하게 만드는것) 속성을 제거

할때 사용하며 , 상수포인터로 선언된것을 비상수 포인터에 값을 넣을때 사용된다. 일반적으로는 비상수 포인터에 상수형 포인터를 넣지

못하지만 const cast 를 사용해서 상수형을 비상수형으로 바꾼다음 값을 넣어줄수 있는 것이다.
  
const_cast<자료형 *>(대상 변수명);



[출처] [C/C++] 형변환|작성자 늑대발바닥

-------------------------------------------------------



    src.copyTo(dst);
    profile.setTo(255);
    uchar value;
    uchar* pSrc = (uchar*)src.ptr<uchar>(row);
    uchar* pDst = (uchar*)dst.ptr<uchar>(row);

6.  그래프 좀더 정확하게 표현하려면
시작점 끝점 동일하게 하면 되지만 보기가 힘들다.

    for (int i = 1; i < src.cols; i++) {
        line(profile, Point(i - 1, 255 - pSrc[i - 1]), Point(i - 1, 255 - pSrc[i-1]), 0);
        pDst[i] = saturate_cast<uchar>(pSrc[i] + 50);
    }

practice_3_profile

#pragma warning(disable: 4819)

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;
void on_trackbar(int, void*);
Mat src, dst, profile;
int row = 0;    
int main(void)
{
    src = imread("lenna.bmp", IMREAD_GRAYSCALE);    if (src.empty()) {      cerr << "Image load failed!" << endl;       return -1;  }
    profile.create(256, src.cols, CV_8U);
    namedWindow("dst");
    namedWindow("profile");
    createTrackbar("Profile", "dst", &row, src.rows - 1, on_trackbar, NULL);
    on_trackbar(0, 0);
    waitKey(0);
    return 0;
}
void on_trackbar(int, void*)
{
    src.copyTo(dst);
    profile.setTo(255);
    uchar value;
    uchar* pSrc = (uchar*)src.ptr<uchar>(row);
    uchar* pDst = (uchar*)dst.ptr<uchar>(row);
    for (int i = 1; i < src.cols; i++) {
        line(profile, Point(i - 1, 255 - pSrc[i - 1]), Point(i, 255 - pSrc[i]), 0);
        pDst[i] = saturate_cast<uchar>(pSrc[i] + 50);
    }
    imshow("dst", dst);
    imshow("profile", profile);
}

댓글 없음:

댓글 쓰기